2016-08-02 70 views
0

我必須根據他們的department篩選Employee。我可以對LINQ做同樣的事情。Lambda條件在加入聲明

Linqlambda編譯得到相同的結果。編譯器在編譯之前會將查詢表達式更改爲等效的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(); 

我能不能添加.Where條款在此拉姆達

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。上述linq的等效lambda表達式是什麼?(如何where子句添加爲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的數字是001940 ms,lamda的數字是0058248。 – Eldho

+0

@Eldho - 我不會急於說它更快(可能是真的,但我不知道足夠多) - 我會檢查正在生成的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 vs Lamda方法的語法或查詢語法?

這實在是您的個人偏好。由於它們被編譯成相同的IL,因此性能是相同的。但是,在某些情況下查詢語法是首選的,例如具有多個連接子句。還有其他時間方法語法發光的地方,比如添加你自己的擴展方法,或者調試每個方法之間的中間結果。

+2

你不需要'Where'中的'Id == EmployeeId' - 你已經做了它在'加入' –

+1

@GiladGreen是的,你是對的,這是暗示的。 – Xiaoy312