2016-08-02 16 views
0

departmentに基づいてEmployeeをフィルタリングする必要があります。 LINQでも同じことができます。Lambda Joinステートメントの条件

Linqおよびlambda同じ結果が得られるようにコンパイルします。コンパイラはコンパイルする前にクエリ式を等価のLambda expressionに変更するため、生成されたILはまったく同じになります。 Source

var deptCollection = new List<Dept>(); 
var employeeCollection = new List<Employee>(); 

employeeCollection.Add(new Employee { Id = 1, Name = "Eldho" }); 

deptCollection.Add(new Dept { DepetarmentName = "a", EmployeeId = 3 }); 
deptCollection.Add(new Dept { DepetarmentName = "a", EmployeeId = 1 }); 

var empinadept = (from e in employeeCollection 
        from dep in deptCollection 
        where e.Id == dep.EmployeeId 
        && dep.DepetarmentName == "a" 
        select e) 
       .ToList(); 
私はできません。このラムダ

var empindeptLamda = employeeCollection 
        .Join(deptCollection, 
        emp => emp.Id, dep => dep.EmployeeId, 
        (em, dep) => em.Id == dep.EmployeeId 
         && dep.DepetarmentName == "a") 
        .ToList(); 

class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class Dept 
{ 
    public int EmployeeId { get; set; } 
    public string DepetarmentName { get; set; } 
} 

Q1で.Where句を追加することができます。上記のlinqの等価ラムダステートメントは何ですか?(このための方法-構文でLINQのような句

+3

もっと読みやすい形式を使用してください... –

+4

[それはLinqかLambdaですか?](http://stackoverflow.com/questions/7391370/is-it-linq-or-lambda)この投稿はかなり良いです – Timmy

+1

基本的には両方ともLinqですが、一方はクエリ構文であり、もう一方はメソッド構文です。 – HimBromBeere

答えて

2

同等の場所を追加する方法:

var empinadept = (from e in employeeCollection 
       from dep in deptCollection 
       where e.Id == dep.EmployeeId 
       && dep.DepetarmentName == "a" 
       select e) 
      .ToList(); 

はこれです:

var result = employeeCollection.Join(deptCollection, 
     e => e.Id, 
     dep => dep.EmployeeId, 
     (e,dep) => new { e, dep }) 
    .Where(item => item.dep.DepetarmentName == "a") 
    .Select(item => item.e) 
    .ToList(); 

より良いオプションがになります

var result = employeeCollection.Join(
      deptCollection.Where(dep => dep.DepetarmentName == "a"), 
      e => e.Id, 
      dep => dep.EmployeeId, 
      (e,dep) => e) 
     .ToList(); 

クエリ構文と最も近いですが(ただし、私はをベース少ない素敵意見)がある(S)

var result = employeeCollection.Join(
     deptCollection, 
     e => new { e.Id, "a" }, 
     dep => new { dep.EmployeeId, dep.DepartmentName }, 
     (e,dep) => e).ToList(); 
+0

これは私のために働く、ベンチマークしたとき、Linqはlamdaより高速です。数字は、linqの場合は、001940ms、lamdaの場合は、0058248です。 – Eldho

+0

@エルド - 私はそれがより速いと言うことに急いではありません(しかし、私は十分ではないかもしれませんが) - 私は生成され、チェックされているSQLをチェックします。また、異なるデータベースを比較します –

+0

これはメモリオブジェクトにあります。これはリスト内にあります – Eldho

0

Q1。上記のlinqに相当するlamda文は何ですか?

var empindeptLamda = employeeCollection 
    .Join(deptCollection, emp => emp.Id, dep => dep.EmployeeId, (e, dep) => new { e, dep }) 
    .Where(x => x.dep.DepetarmentName == "a") 
    .Select(x => x.e) 
    .ToList(); 

Q2。いつ私が LINQ対Lamdaの構文またはクエリ構文を選択する必要がありますか?

これは本当に個人の好みです。それらは同じILにコンパイルされているので、パフォーマンスは同じです。ただし、複数のjoin句を持つなど、クエリ構文が優先される状況があります。また、独自の拡張メソッドの追加や各メソッド間の中間結果のデバッグなど、メソッド構文が輝く他の時間。

+2

'Where =' EmployeeId'は 'Where'には必要ありません。それは 'Join'にあります。 –

+1

@GiladGreen Yea、そうです、それは暗示されました。 – Xiaoy312