3

C# アプリで個別の操作を行う Linq が必要です

SQL は次のようになります。

 select distinct(col1) from tableName;

私はいくつかの例を読んで、次のようにLinqを書くことができることを知っています:

var myRes =
    (
         from a in tableName
         select a.col1
    ).Distinct();

だからここに私の質問があります:

このlinqはありますか:

MSSQLサーバーからmyResまでのcol1のセット全体を取得し、 C#のdistinct()関数を使用してアプリ側で区別しますか?

もしそうなら、サーバー側で区別することはできますか?

またはそれは:

MSSQL サーバーから個別のcol1のみを取得し、アプリ側では何もしませんか?

どうもありがとう!

4

1 に答える 1

4

これはDISTINCT、フィルターが適用される前に他の何かがクエリを実行しない限り、データベース側でフィルターを実行する必要があります。これは、クエリの実行時に SQL Server プロファイラーを実行することで確認できます。

これが機能する方法は、遅延実行を使用することです。つまり、必要になるまで、クエリは実際にはデータベースに対して実行されません。その前に、式ツリーと呼ばれるものを構築し、データ ソースに対して評価します。そのため、そのステートメントに拡張メソッドを追加することができIQueryable<T>、それらはすべてデータベースに対する単一のクエリに変換されます。

この場合 ( myRes) は実際には結果セットではなく、結果セットを作成するクエリへの参照です。クエリは、列挙が実際の結果セットに評価されるときに構築および評価されます。あなたが電話するときなど:

  • .ToList()
  • .Single()
  • .SingleOrDefault()
  • .First()
  • .FirstOrDefault()

基本的に、クエリへの参照を受け取り、それを実際の値または値のコレクションに変換するもの。

于 2013-09-20T00:42:06.283 に答える