Как создать универсальное лямбда-выражение. Многие из моих сущностей выполняют один и тот же предикат лямбда-выражения.

Я использую Entity Framework 4.
Как я могу выполнить универсальное предложение Where Lambda?

У меня есть много объектов, которым нужен один и тот же запрос «Где».

public Func<SupplierTypeText, bool> GetLmbLang()
{
    return (p => p.LangID == 1);
}


public Func<ProductText, bool> GetLmbLang()
{
    return (p => p.LangID == 1);
}


public Func<CategoryText, bool> GetLmbLang()
{
    return (p => p.LangID == 1);
}

Я хотел бы иметь общий метод, например

//public interface IRepository<T> : IRepository<T> where T : class
public Func<T, bool> GenericGetLmbLang()
{
    return (p => p.LangID == 1);
}

На данный момент я жестко запрограммировал идентификатор языка == 1, который будет из сеанса пользователя, чтобы сделать его динамическим.
Было бы очень полезно, если бы я мог напрямую вызывать GetLmbLang() непосредственно в предложении Where.

 var ViewModel = _db.Suppliers.Select(model => new
            {
                model,
                SupType = _db.SupplierTypeTexts.Where(a => GenericGetLmbLang())
            });

------ОБНОВЛЕНИЕ--------
Вот что я пытаюсь сделать, и ничего не получается.

Мой базовый класс

 public class BaseGenericModel
    {
        public int LangID { get; set; }

        public Func<BaseGenericModel, bool> GetLmbLang()
        {
            return (p => p.LangID == 1);
        }

    }

Мой интерфейс

   public interface IBaseRepository<T> where T : BaseGenericModel
   {
        Func<T, bool> GetLmbLang();
   }


   public class BaseRepository<T> : IBaseRepository<T> where T : BaseGenericModel
   {

       public Func<T, bool> GetLmbLang()
       {
          return (p => p.LangID == 1);
       }
   }

Я не могу вызвать этот репозиторий из моего SupplierTypeText, ProductText, CategoryText. Это не работает.


person Jean-Francois    schedule 23.10.2010    source источник


Ответы (1)


Кажется, у вас есть три разных типа, каждый из которых имеет свойство LangID. Я бы сделал их производными от общего базового класса, в котором определено это свойство:

public class BaseClass
{
    public int LangID { get; set; }
}

а затем есть один метод:

public Func<BaseClass, bool> GetLmbLang()
{
    return (p => p.LangID == 1);
}

Также можно использовать интерфейс, содержащий это свойство.

Если вы хотите сделать его универсальным, вы можете это сделать, но вам все равно понадобится универсальное ограничение для указания общего базового типа, если вы хотите использовать свойство LangID:

public class SomeRepository<T> where T: BaseClass
{
    public Func<T, bool> GetLmbLang()
    {
        return (p => p.LangID == 1);
    }
    ...
}
person Darin Dimitrov    schedule 24.10.2010
comment
Я использую Entity Framework 4. Как я могу сделать SupplierTypeText, ProductText,CategoryText производным от BaseClass для использования вашего универсального метода GetLmbLang(). - person Jean-Francois; 25.10.2010
comment
Эти классы SupplierTypeText,ProductText,CategoryText не могут быть производными от BaseClass, поскольку они уже являются производными от EntityObject. - person Jean-Francois; 25.10.2010
comment
Затем заставьте их реализовать интерфейс. - person Darin Dimitrov; 25.10.2010
comment
Я не уверен, что полностью понимаю, как это сделать. Почитаю про интерфейс и попробую. Я сделал интерфейс для всего своего репозитория, и каждый интерфейс предназначен для одной модели класса. @Дарин, спасибо за помощь, скоро сообщу новости. - person Jean-Francois; 26.10.2010
comment
Хорошо, я понял. Спасибо за помощь Дарин. - person Jean-Francois; 26.10.2010