1

我有一些具有 CategoryId 成员的 EF 代码第一类,该成员也在名为 ICategoryFilterable 的接口中定义。

    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 基元或枚举类型。

4

1 回答 1

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);
于 2013-03-15T16:06:44.697 回答