3

Entity Framework と Linq to Entities を使用しています。バージョニングとローカリゼーションを実装するための小さなデータベース パターンとフレームワークを作成しました。すべてのエンティティは、2 つまたは 3 つのテーブル (つまり、Product、ProductBase、および ProductLocal) で構成されています。

私のlinqには常に次のボイラープレートコードが含まれています:

from o in DB.Product
from b in o.Base
from l in o.Local
WHERE o.VersionStatus == (int)VersionStatus.Active 
   && b.VersionStatus == (int)VersionStatus.Active 
   && l.VersionStatus == (int)VersionStatus.Active 
   && l.VersionLanguage == Context.CurrentLanguage
select new ProductInstance { Instance = o, Base = b, Local = l }

私が達成したいのは、上記を次のようにすることです。

(from o in DB.Product
 from b in o.Base
 from l in o.Local
 select new ProductInstance { Instance = o, Base = b, Local = l }).IsActive()

または最悪の場合、次のようなものです。

from o in DB.Product.Active()
from b in o.Base.Active()
from l in o.Local.Active()
select new ProductInstance { Instance = o, Base = b, Local = l }

EDM が生成する基本クラスを拡張して、プロパティ ( IVersionStatus や IVersionLanguage ) を適用するいくつかのインターフェイスを実装しました。式ツリーをたどり、式の型がそのインターフェイスを実装しているかどうかを確認し、それに応じて VersionStatus を設定する方法はありますか?

最初のオプションと同じくらいシンプルで、書くことや忘れることが少なくなるのが大好きです. 事後、IEnumerable の後でそれを行う例を見てきましたが、必要以上にデータベースから取得したくありません。

ヒントをありがとう!

4

3 に答える 3

3

はい。

これを行うには、IQueryableでIsActiveという名前の拡張メソッドを定義します。IQueryableには、クエリから生成されたLINQメソッド呼び出しのチェーンを表す式ツリーを返す「Expression」というプロパティがあります。

あなたの場合、それは次のようになります:

DB.Product.SelectMany(o=>o.base, (o, b)=>new{o.b}).SelectMany(item=>o.local, (item, local)=>new {item.o, item.b, item.local}).Select(item=>new ProductInstance { Instance = item.o, Base = item.b, Local=item.Local});

「DB.Product」は、最初のFrom句のアイテムです。残りの各「SelectMany」呼び出しは、追加のfrom句です。

次に、式ツリーを掘り下げて、すべてのfrom句要素を収集できます。それらの型を調べて、最後にwhere句の式ツリーを生成します。

次に、拡張メソッドは、生成したwhere句を使用してIQueryable引数から.Whereを返します。

結果のWhere句は、結果を「foreach」しようとすると、残りのクエリとともにサーバー上で実行されます。

編集:

これを明示的な「Join」句で機能させる場合は、「SelectMany」に加えて「Join」メソッドのサポートも追加する必要があることに注意してください。

于 2008-10-20T01:22:39.483 に答える
0

私は間違っているかもしれませんが、EntityFrameworkでは機能しないと思いますDataLoadOptions

于 2008-10-20T01:18:54.903 に答える
0

そのオブジェクトで指定した外部キ​​ー関係を自動的にロードするには、DataLoadOptions クラスを使用する必要があります。これにより、実際に行っていることを指定したリンク テーブルが自動的に取得されるようになります。

このページでは、それを行う方法を詳しく説明し、あなたが探していると私が思うものについて詳しく説明します.

http://www.crazysalsadancer.com/2008/08/effective-data-loading-with-linq-using.html

于 2008-10-20T01:08:42.677 に答える