2012-04-18 6 views
0

Linqを使用してリポジトリ外のクエリを構築している間に、リポジトリ外のエンティティにLinqを公開/漏洩させることなく、データベースでデータをフィルタリングできますか?明らかに、私はQuery()メソッドや仕様オブジェクトのパラメータとしてlamba式を構築できましたが、リポジトリでどのデータプロバイダが使用されているかにかかわらず、Linqを使って効率的な随時クエリを作成したいと考えていました。例えばリポジトリの外部でLinqを使用する可能性があります。

var myProductID = myRepo.Query() 
        .Where(p => p.color.Contains("green")) 
        .Select(p => p.ID.ToString()); 

概念は、相互に排他的なようです。

答えて

2

しかし、私は何とかLinqを使って、リポジトリでどのデータプロバイダが使用されているかにかかわらず効率的なアドホッククエリを作成したいと考えていました。

このアイデアは失敗することになります。問題は、すべてのラムダ式がすべてのLINQプロバイダによってそのプロバイダが処理できるものに変換できるわけではないことです。これは恐ろしい "LINQ to Entitiesがこのメソッドを認識しない"のソースです。他のLINQプロバイダの類似の例外メッセージです。 LINQ to SQLは処理できる式がありますが、LINQ to Entitiesは処理できません。またその逆もあります。 NHibernateのLINQプロバイダに同様の問題を投げます。

要するに、LINQyの方法でリポジトリを照会することは、漏れた抽象的なものです。避け、避け、回避する。

+2

さらに、いくつかのEF Linqクエリは、Linq to Objectsと同じ構文を使用すると動作が異なります(例:SequenceEqual vs ==バイト配列上)。非常に漏れやすい抽象化。 – BrokenGlass

+0

@BrokenGlass:優秀な点。 – jason

関連する問題