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 に答える