2

次のケースがあります。

EF コンテキストで次の linq クエリを実行する必要があります

from table1 in context.TableOne
join table2 in context.TableTwo on table1.SomeFKId equals table2.Id
join table3 in context.TableThree on table2.SomeFKId equals table3.Id
...
join tableN in context.TableN on tableN_1.SomeFKId equals tableN.Id
where case1 && case2 && case3 ... && caseN
select new TablesDto { VarOne = table1.Var , VarTwo = tableN_2.var }

私の問題は、多くの拡張機能を備えたさまざまなシナリオで同じクエリを使用したいということです。何度も書くのではなく(DRYの原則)、単に拡張するだけですが、効率と速度を犠牲にすることはありません。

つまり、最初のテーブルを別のテーブルに結合したい場合は、Dto を拡張して残りの変数を組み込むことができますが、行を反復処理する場合は、行ごとにクエリを実行して拡張する必要があります。100 行から 5000 行の話なので、繰り返しにも時間がかかります。

その他のケース (case1、case2 など) およびその他の結合。

拡張子の例:

from table1 in context.TableOne
join table2 in context.TableTwo on table1.SomeFKId equals table2.Id
join table3 in context.TableThree on table2.SomeFKId equals table3.Id
...
join tableN in context.TableN on tableN_1.SomeFKId equals tableN.Id
join extTable in context.TableExt on table2.SomeFKId equals extTable.Id
where case1 && case2 && case3 ... && caseN || extTable.NumOfSmth == 4
select new ExtTablesDto { VarOne = table1.Var , VarTwo = tableN_2.var , ExtVar = extTable.Name }
4

2 に答える 2

1

このように非常に簡単にwhereクエリを拡張できます

var query = from user in dbContext.Users where user.id = 10;

if (x == 3)
{
   query = query.where(p=>p.name == "test");
}

など、ここで基本クエリを拡張できます。UserId = 10 および name = "test" の後に検索します。

EF モデルがある場合は、そこにテーブル間の依存関係を作成しようとする必要があります。クエリでそれらを結合する必要はありません。

于 2013-09-25T06:53:45.710 に答える