2013-03-15 118 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 2013-03-15 16:10:49

+0

你可以給你的問題添加一個FilterByCategory方法調用的例子嗎? – Oliver 2013-03-15 16:13:30

+0

查看更新,我添加了一個額外的通用類型。 – Oliver 2013-03-15 16:19:33