2013-04-24 11 views
9

私はASP.NET、C#、WebアプリケーションでEntity Frameworkを使用しています。 DataBase(データアクセスレイヤー)からレコードを選択する必要がある場合、どのメソッドを使用する必要がありますか? Linqクエリまたはラムダ式?Linqクエリまたはラムダ式?

例: -

//Linq   
var result = from a in db.myTable.Take(1) where a.Id == varId select a; 
return result.First(); 

//Lambda 
return db.myTable.FirstOrDefault(a => a.Id == varId); 

他の上、このシナリオまたは任意の利点で任意の好ましい方法はありますか?

+5

必要に応じて使い分けてください。 (BTW:彼らは同じことをしていない) – I4V

+1

[LINQ - クエリの構文とチェーンのラムダの可能な複製](http://stackoverflow.com/questions/8037677/linq-query-syntax-vs-method-chains -lambda) – I4V

答えて

14

クエリ式はメソッド式(ラムダ式)にコンパイルされるので、違いはありませんFirstFirstOrDefaultにアクセスしていますが、コードに違いはありません。

参照:Query Syntax and Method Syntax in LINQ (C#)

LINQ Query Expressions (C# Programming Guide)

コンパイル時には、クエリ式は、標準クエリ演算子 方式に変換されているC# 仕様に記載されたルールに従って呼び出します。クエリ構文 を使用して表現できるクエリは、メソッド構文を使用しても表現できます。しかし、ほとんどの場合、 クエリ構文がより読みやすく簡潔です。

+2

msdnリンクの場合+1 –

+0

割り当てについてはどうですか? – dariol

0

私は結果が同じだと思います。ラムダはもう少し快適です。 1つのテーブルの結果が必要な場合、ラムダ式は非常に高速で読み込みが容易です。

5

Linqクエリ構文は、表現方法の構文シュガーに過ぎません。式のメソッドにコンパイルされたLinqクエリ。ところで、あなたの最初のクエリ:

var query = from a in db.myTable.Take(1) 
      where a.Id == varId 
      select a; 
return query.First(); 

return db.myTable.Take(1).Where(a => a.Id == varId).First(); 
3

あなたの試行の両方のLINQを使用することと同じです。

最初のレコードは1レコードを取り、そのIDが一致するかどうかを確認します。

第2のレコードは、idが一致する最初のレコードをとります。

これは違いです。

0

すべてのクエリ式は、クエリ演算子の呼び出しを使用してC#コードとして表すことができます。しかし、その反対は真実ではありません。標準的なクエリ演算子の小さなサブセットのみがクエリ式のキーワードとして使用できます。言い換えれば、クエリ式には、メソッド呼び出しメカニズムにはないいくつかの制限があります。

  1. クエリ演算子の中には、単純にC#クエリ式に相当するものがありません。 ToArray()。
  2. C#のクエリ式では、すべての種類のオーバーロードを使用することはできません。例えば。現在反復されているオブジェクトのインデックスを待つSelect()のオーバーロードがあります。クエリ式内でこのオーバーロードを呼び出すことはできません。
  3. クエリ式でステートメントlambdaを使用することはできません。 - これが、オブジェクトとコレクションの初期化子がC#言語に導入された理由です。