0

次のようなlinqクエリがあります:

from x in from dbcontext
 join y in dbcontext on x.id equals y.id select new {x,y}

私の問題は、これらの種類のクエリをオブジェクトとしてサーバーに送信する方法です。ここで、私のlinqクエリは直接データアクセスです。データサーバーに送信する必要がありますが、オブジェクトが必要です。どうすればこれを実装できますか?

4

3 に答える 3

2

ひどく。Linq クエリには、コンテキストへの参照が含まれています。クライアントにはコンテキストがありません。コンテキストがあったとしても、サーバーでは別のインスタンスになります。そのようなことを行うには、非常に大きな努力が必要です。また、プロジェクションを匿名型に戻しています。これは、リモートで実行する場合のもう 1 つの非常に複雑な機能です。

これはもちろん処理できます - WCF Data Services は既にこれを行っています。コンテキストのクライアント側「プロキシ」があり、クエリは OData クエリ文字列としてシリアル化され、サーバー側でその文字列から式ツリーが構築されます。プロジェクションもサポートしていますが、STE はサポートしていません。WCF Data Servicesを試してください。

WCF Data Services の考え方が気に入らない場合は、サーバー側でそのようなクエリごとにメソッドを公開し、クライアントがそのメソッドをリモートで呼び出す必要があります。

于 2011-04-19T07:59:46.013 に答える
1

まず、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

于 2011-04-19T08:36:53.323 に答える
0

式ツリーはシリアル化できないため、簡単には実行できません。

私のデータ アクセス レイヤーは EF で構築されていないため、私のソリューションは役立つ場合とそうでない場合がありますが、ここではとにかく:
クライアント側の式を解析して、自作のシリアル化可能な式 (「列」などのプロパティを持つ) にします。 、「結合」、「フィルター」など)、サーバー側では、これらの式に基づいてSQLを作成します。
もちろん、それらから式を作成し、EF linq プロバイダーに対して送信することもできます!

于 2011-04-19T07:57:36.213 に答える