0

私は EF5 の経験があまりなく、私の DBA は非常に複雑なクエリを生成するだけで、ツールの選択は非常に限られていました。問題を説明します。データベースは正規化されていないため、このようなクエリが必要になります。そして、その構造とクエリに影響を与えることはできませんたとえば、クエリがあります:

SELECT A.my_id, 
    A.field_1, 
    A.field_2, 
    A.field_3, 
    A.field_4, 
    A.field_5, 
    A.field_6,
    A.field_7, 
    A.field_8, 
    A.field_9, 
    B.field_10, 
    C.field_11, 
    C.field_12,
    C.field_13, 
    C.field_14, 
    D.field_15, 
    E.my_id2, 
    E.field_16, 
    E.field_17, 
    E.field_18, 
    G.field_19
    etc...
FROM tbl1 A, 
tbl2 B, tbl3 C, tbl4 D, tbl5 E, tbl6 F, tbl7 G
WHERE A.my_id                   = B.my_id
  AND A.my_id                   = C.my_id
  AND A.my_id                   = D.my_id
  AND A.my_id                   = E.my_id
  AND E.my_id3                  = F.my_id3
  AND E.my_id4                  = G.my_id4
  AND E.my_id2                  = <value from code>
  AND F.param1                  = <value from code>
  AND B.param4                  = 'KEY1'
  AND B.param5                  = 'KEY2'
  AND E.param8                  > 0 
  AND E.param9                  = 'KEY3'
  AND E.param10                 <> 'KEY4'       
  AND G.param11                 = 'KEY5'
  AND G.param12                 <= <SYSTEM DATETIME>
  AND G.param13                 >= <SYSTEM DATETIME>
  AND A.param2                  <= <SYSTEM DATETIME>
  AND A.param3                  >= <SYSTEM DATETIME>
  AND B.param6                  <= <SYSTEM DATETIME>
  AND B.param7                  >= <SYSTEM DATETIME>`

次に、Entity Framework 5 を使用してコード内のクエリを移動するときに発生した問題について説明します。

メインテーブルにINNER JOINします。このような。

ObjectContext.CreateQuery<ETbl5>(entityName).
.Where(E =>
    E.param2 >= SqlFunctions.GetDate() && E.param3 <= SqlFunctions.GetDate() &&
    E.param8 > 0 && E.param9 == "KEY3" &&
    E.param10 != "KEY4" && E.my_id2 == <value from code>
)
.Join((Context as MyDbContext).ETbl7 ,
    E => new { A.my_id4},
    G => new { B.my_id4},
    (E, G) => E
)

JOIN as の条件を追加するにはどうすればよいAND G.param12 <= <SYSTEM DATETIME>ですか? 匿名型にそのような条件を追加するにはどうすればよいですか?

私はいつも多くの問題を抱えており、間違った方向に進んでいると思います。おそらく、問題を解決することに加えて、そのようなクエリを処理するための正しい戦略を教えてください. ストアド プロシージャに転送できることは理解していますが、IQuerable がページネーションを使用して Grid で使用できる結果が必要です。ご清聴ありがとうございました。

4

1 に答える 1

4

DBA のクエリに基づいてデータベースにビューを作成し、それを Entity Framework モデルにマップするという、少し異なるアプローチをお勧めします。IQueriable の利点が得られ、これらの複雑なクエリをすべて変換する必要はありません。さらに、(SQL から LINQ への) クエリ変換中に発生する可能性のあるエラーについては責任を負いません。

于 2012-09-27T18:03:30.190 に答える