3

私は Entity Framework (EF) と LINQ の両方の初心者です。

私の質問は少し長いですが、本当にとてもシンプルです。LINQ を使用して RDBMS からデータを取得するクエリを作成する場合は、次のように言います。

using (MyEntities myEntities = new MyEntities())
{
    // ...
    var query = from rec in myEntities.SomeTable
                where rec.Id == someId
                select rec;
    // ...
}

最終的に実行されると、これは実際に SQL に変換されて DB 自体で実行されますか (そのマシンがどこにあっても)、または基になるレコードが最初にホスト マシンに実際に取得され、次に実行中のアプリ自体によってフィルター処理されます (何らかの LINQ および/またはを使用) EFマジック)。

IOW、上記の「SomeTable」のすべてのレコードが基になる DB からホスト マシンに取得され、LINQ および/または EF が指定された「someId」を持つレコードの検索を処理するか、または上記のクエリが次のように変換されます。実際の SQL ステートメントであり、DB マシン自体で実行されます (指定されたレコードが返されます)。

後者だと思いますが(そうでなければ非常に非効率的です)、誰かがこれを確認できますか。さらに、LINQクエリがどれほど複雑であっても(複雑な結合などが含まれている可能性があるため)、これは適用されますが、もちろんクエリで呼び出される可能性のあるローカル関数は含まれません。

内部で何が起こっているのか、また LINQ が従来の SQL テキスト クエリの高レベルの代替として効果的に使用できるかどうか (つまり、LINQ は舞台裏で実際の SQL クエリを作成し、それらをDB を実行しますが、クエリでローカル関数呼び出しを処理する場合を除いて、実際の実行自体には参加しません)。前もって感謝します。

4

1 に答える 1

3

バックグラウンドで生成された SQL クエリがあります。関連するデータのみをフェッチするために必要なほど複雑になる場合があります。

特定の LINQ 機能がデータベースに対してサポートされていないためにクエリを生成できない場合、式全体が (SQL に) コンパイルされません。すべてのデータをフェッチしてから、クライアント側で複雑な方法でフィルタリングする場合は、この動作を手動でオーバーライドできます。そのためには、LINQ クエリの早い段階で.ToList()orを配置し、そのリストを続けます。.ToArray()where

結果の SQL を表示することもできます。

詳細: LINQ to SQL クエリ

于 2012-07-22T16:29:19.090 に答える