Лямбда-запрос на Generi c Тип T - PullRequest
0 голосов
/ 26 января 2020

У меня есть базовый класс модели

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();
    }
}

Как я могу фильтровать на основе по внешнему идентификатору ребенка A

Ответы [ 2 ]

0 голосов
/ 26 января 2020

напиши же это:

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>
    {

    }
}
0 голосов
/ 26 января 2020

Демонстрация на скрипке

У вашего дизайна такая проблема

'ChildA.ExternalId' скрывает унаследованный элемент 'BaseModel.ExternalId'

Вы не должны объявлять ExternalId в ChildA классе.

TestMethod не возвращает значение, поэтому вы должны вернуть вместо него.

'Test.TestMethod (System.Collections.Generi c .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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...