-1

重複の可能性:
LINQ to Entities がメソッドを認識しない

Entity Framework 4.3 を使用しています

私は拡張メソッドを書きます:

public static IQueryable<TSource> Active<TSource>(this IQueryable<TSource> source) where TSource : class, IStatusable
{
    return source.Where(s => s.Status == (int)StatusEnum.Enabled);
}

これはうまくいきます:

var cat=Context.Categories.Active().ToList()

しかし、Select でこの拡張メソッドを使用する必要があります。簡略化されたクエリを見てください:

return Context.Categories
 .Select(c => new { Children=c.Children.AsQueryable().Active()})
 .ToList()

(子 - 子カテゴリのコレクション) クエリを実行すると、次のエラー メッセージが表示されます。

LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[Portal.FrontOffice.Model.Category] Active[Category](System.Linq.IQueryable`1[Portal.FrontOffice.Model.Category])' method, and this method cannot be translated into a store expression.

なぜ機能しないのですか?正しく書くには?

4

1 に答える 1

2

私のコメントで述べたように、このエラー メッセージが表示されるたびに同じ理由です。

EF プロバイダーが SQL を作成するために使用する式ツリーに、理解できないメソッドが含まれています。
あなたの場合、これはActive拡張メソッドです。これは、別の式 ( Select) 内で使用されるため、式ツリーの一部です。

最初のクエリでは、メソッドは式ツリーの一部ではありません。代わりに、式を追加して式ツリーを変更Whereするだけです。それが根本的な違いです。

2 番目のクエリを機能させるには、次のようにします。

return Context.Categories 
              .Select(c => new { Children=c.Children
                                           .Where(s => s.Status == 
                                                       (int)StatusEnum.Enabled) }) 
              .ToList() 
于 2012-09-05T10:58:40.493 に答える