2016-03-31 4 views
1

Я пытаюсь реализовать общий метод с предикатом. Я написал код:Получить элементы по методу предикатов

public ICollection<T> GetProductsByMatching<T>(Expression<Func<T, bool>> predicate) 
{ 
    return context.Products.Where(predicate).Include("ShopPlace, Images").ProjectTo<T>().ToList(); 
} 

и использование этого метода:

var a = service.GetProductsByMatching<ProductInfo>(x => x.Name.StartsWith("value") 
     || x.Price < 150); 

Наконец я имею Invalid Operation Exception: Нет общий метод 'Где от типа «System.Linq.Queryable» совместим с аргументы и аргументы поставляемого типа.

Что не так с моим кодом? Благодарим за продвижение!

+0

Поскольку 'T' =' Product'. Что должен делать этот код? Вы хотите называть 'context.Set ' вместо этого? – CodeCaster

+0

@CodeCaster получает продукты из базы данных по предикату и сопоставляет его с ProductInfo (класс ViewModel) – user3818229

+0

Да, часть _that_ очевидна из кода, но я пытаюсь выяснить причину для ввода выражения 'Expression >' в первое место. В моем ответе я теперь сделал некоторые предположения, основанные на имени метода. – CodeCaster

ответ

3

Предикат в context.Products.Where(predicate), очевидно, может быть только Expression<Func<Product, bool>>, не Expression<Func<T, bool>>, потому что нет никакой гарантии, что T является Product.

Вы пытаетесь фильтровать по предикату по типу назначения, в то время как фильтрация должна происходить по типу источника:

public ICollection<T> GetProductsByMatching<T>(Expression<Func<Product, bool>> predicate) 
{ 
    return context.Products.Where(predicate) 
          .Include("ShopPlace, Images") 
          .ProjectTo<T>() 
          .ToList(); 

} 
+0

Я подозревал. Но я не хочу иметь ссылки на класс «Product» в области использования методов. Можно написать функцию для фильтрации продуктов по полю 'ProductInfo'? – user3818229

+0

Это совсем другой вопрос. Вы не можете сделать это с ProductInfo (поскольку этот класс не имеет никакого отношения к Продукту вообще и может содержать свойства, которые ваш Продукт не содержит, поэтому ваше выражение не может быть переведено в несуществующие столбцы в вашей базе данных). Вы можете добавить интерфейсный слой, где пользователь запрашивает интерфейс, и вы применяете этот интерфейс к вашим сущностным моделям. – CodeCaster

+0

Есть ли способ преобразовать/изменить/сопоставить исходный предикат на основе класса ProductInfo в классе Product, если я уверен в идентичных свойствах. Я хочу сохранить тело выражения, но предикат отличить от другого. – user3818229

Смежные вопросы