次のようなlinqクエリがあります:
from x in from dbcontext
join y in dbcontext on x.id equals y.id select new {x,y}
私の問題は、これらの種類のクエリをオブジェクトとしてサーバーに送信する方法です。ここで、私のlinqクエリは直接データアクセスです。データサーバーに送信する必要がありますが、オブジェクトが必要です。どうすればこれを実装できますか?
次のようなlinqクエリがあります:
from x in from dbcontext
join y in dbcontext on x.id equals y.id select new {x,y}
私の問題は、これらの種類のクエリをオブジェクトとしてサーバーに送信する方法です。ここで、私のlinqクエリは直接データアクセスです。データサーバーに送信する必要がありますが、オブジェクトが必要です。どうすればこれを実装できますか?
ひどく。Linq クエリには、コンテキストへの参照が含まれています。クライアントにはコンテキストがありません。コンテキストがあったとしても、サーバーでは別のインスタンスになります。そのようなことを行うには、非常に大きな努力が必要です。また、プロジェクションを匿名型に戻しています。これは、リモートで実行する場合のもう 1 つの非常に複雑な機能です。
これはもちろん処理できます - WCF Data Services は既にこれを行っています。コンテキストのクライアント側「プロキシ」があり、クエリは OData クエリ文字列としてシリアル化され、サーバー側でその文字列から式ツリーが構築されます。プロジェクションもサポートしていますが、STE はサポートしていません。WCF Data Servicesを試してください。
WCF Data Services の考え方が気に入らない場合は、サーバー側でそのようなクエリごとにメソッドを公開し、クライアントがそのメソッドをリモートで呼び出す必要があります。
まず、IIRCでは式をシリアル化できないため、まずこの投稿を見てください
次に、次の線に沿った何か:
public List<ContactDetails> GetAllContactDetails( List<Guid> ContactIDs, Func<List<ContactDetails>, IEnumerable<ContactDetails>> filter )
{
List<ContactDetails> result = new List<ContactDetails>();
// get contacts as usual, fill result
// ...
return filter.Invoke( result ).ToList();
}
使用法:
GetAllContactDetails( idList, ( result ) =>
from contact in result
where contact.DateOfBirth > DateTime.Now.AddYears( -10 )
select contact );
DR
式ツリーはシリアル化できないため、簡単には実行できません。
私のデータ アクセス レイヤーは EF で構築されていないため、私のソリューションは役立つ場合とそうでない場合がありますが、ここではとにかく:
クライアント側の式を解析して、自作のシリアル化可能な式 (「列」などのプロパティを持つ) にします。 、「結合」、「フィルター」など)、サーバー側では、これらの式に基づいてSQLを作成します。
もちろん、それらから式を作成し、EF linq プロバイダーに対して送信することもできます!