通用类型T的Lambda查询

问题描述 投票:0回答:2

我有baase模型课程

public class BaseModel
{
  [Not Mapped]
  public string ExternalId;
}

基本模型类被两个子类继承

public class ChildA : BaseModel
{
  public string ExternalId;
}

public class ChildB : BaseModel
{
  public string Name;
}

所有子类均继承自BaseModel。我已经在某些子类中声明了ExternalId,因此可以在我的抽象类中使用linq。由于这些模型首先在EF模型中使用,因此这就是为什么在BaseModel中它具有NotMapped属性,因此EF无法生成此列。

这是抽象类

public abstract class Test<T> : ITest<T> where T : BaseModel, new()
{
    protected virtual IEnumerable<T> TestMethod(IEnumerable<T> listModels)
    {
        var items = listModels.Where<T>(i => i.ExternalId != "ABC").ToList();
    }
}

如何根据ChildA的ExternalId进行过滤

linq generics lambda
2个回答
0
投票

Demo on fiddle

您的设计有这样的问题

'ChildA.ExternalId'隐藏继承的成员'BaseModel.ExternalId'

您不应该在ExternalId类中声明ChildA

  1. TestMethod没有返回值,所以您应该返回。

''Test.TestMethod(System.Collections.Generic.IEnumerable)':并非所有代码路径都返回值

您应该这样解决

public interface ITest<T> where T : BaseModel, new()
{
     IEnumerable<T> TestMethod(IEnumerable<T> listModels);
}


public class Test<T> : ITest<T> where T : BaseModel, new()
{
    public IEnumerable<T> TestMethod(IEnumerable<T> listModels)
    {
        return listModels.Where<T>(i => i.ExternalId != "ABC").ToList();
    }
}

0
投票

对此写相同:

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            testFinal tf = new testFinal();

            List<BaseModel> mylist = new List<BaseModel>()
            {
                new ChildA(){ ExternalId = "1"},
                new ChildB(){ ExternalId = "1"},
                new ChildA(){ ExternalId = "2"},
                new ChildA(){ ExternalId = "3"},
                new ChildA(){ ExternalId = "1"},
                new ChildB(){ ExternalId = "2"},
            };

            var result = tf.TestMethod(mylist);
            Console.ReadLine();
        }
    }



    public class BaseModel
    {
        public string ExternalId;
    }


    public class ChildA : BaseModel
    {
        //public string ExternalId;
    }

    public class ChildB : BaseModel
    {
        public string Name;
    }


    public abstract class Test<T> : ITest<T> where T : BaseModel, new()
    {
        public IEnumerable<T> TestMethod(IEnumerable<T> listModels)
        {
            var items = listModels.Where<T>(i => i.ExternalId != "1").ToList();
            return items;
        }
    }


    public interface ITest<T> where T : BaseModel
    {
        IEnumerable<T> TestMethod(IEnumerable<T> listModels);
    }

    public class testFinal : Test<BaseModel>
    {

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.