2013-03-15 3 views
1

У меня есть несколько классов EF-кода, в которых есть элемент CategoryId, который также определен в интерфейсе под названием ICategoryFilterable.LINQ to Entities и литье

public class One : ICategoryFilterable 
    { 
     public int CategoryId { get; set; } 
     /* more properties here */ 
    } 

    public class Two : ICategoryFilterable 
    { 
     public int CategoryId { get; set; } 
     /* more properties here */ 
    } 

    public interface ICategoryFilterable 
    { 
     int CategoryId { get; set; } 
    } 

Теперь я хотел бы получить записи из базы данных по указанным категориям. Я создал общий метод для этого, но он не работает, и я не могу найти решение для этого.

private IQueryable<T> FilterByCategory<T>(IQueryable<T> items, IEnumerable<int> filter) 
     where T : ICategoryFilterable 
    { 
     return from item in items 
       where filter.Contains(item.CategoryId) 
       select item; 
    } 

Невозможно бросить тип 'MyNamespace.One' к типу 'MyNamespace.ICategoryFilterable'. LINQ to Entities поддерживает только листинг примитивных или перечисляемых типов EDM.

ответ

2

Этот должен работа ...

Вы можете использовать делегат, чтобы выбрать соответствующую категорию ID:

private IQueryable<T> FilterByCategory<T> 
       (IQueryable<T> items, IEnumerable<int> filter, 
       Func<T, int> categorySelector) 
    { 
     return items.Where(i => filter.Contains(categorySelector(i))); 
    } 

Быстрый пример использования:

 var source = Enumerable.Empty<One>().AsQueryable(); 
     var filter = Enumerable.Empty<int>(); 

     var filtered = FilterByCategory(source, filter, s => s.CategoryId); 
+0

Пожалуйста, смотрите мой изменения. Однако это тоже не сработает (прочитайте исключение). – tuta4

+0

Не могли бы вы добавить пример вашего метода метода FilterByCategory на ваш вопрос? – Oliver

+0

См. Обновление, я добавил дополнительный родовой тип. – Oliver