2014-06-24 162 views
0

我嘗試使Lambda表達式從特定應用程序獲取文件夾中的每個Case。 我有2個表:左連接使用Linq和Lambda表達式返回左表

表1:案例

CaseId | FolderId | CaseContent 
0  1   "blap" 
1  2   "blop" 
2  1   "blup" 
3  3   "blip" 

表2:文件夾

FolderId | ApplicationId 
0   1 
1   1 
2   1 
3   2 

我想任何情況下,多數民衆贊成在文件夾中具有的applicationID返回1

結果:

CaseId | FolderId | CaseContent 
    0  1   "blap" 
    1  2   "blop" 
    2  1   "blup" 

我找到了一個表達加入這裏的一個很好的例子: http://www.c-sharpcorner.com/UploadFile/54db21/inner-join-using-linq-with-lambda/

爲什麼我不能用這個的原因是因爲它是從兩個表返回內容

var query = objEntities.Employee.Join(objEntities.Department, r => r.EmpId, p => p.EmpId, (r,p) => new{r.FirstName, r.LastName, p.DepartmentName}); 

所以不是

(r,p) => new{r.FirstName, r.LastName, p.DepartmentName} 

我希望它返回整個'r',而不是'p'。

我tryed在

IQueryable<Case> cases = Cases.Join(Folders, f => f.Folder.folderId, c => c.folderId, (c) => c); 

針的線話要說這是行不通的。 :(

在此先感謝!

回答

1

那裏有好幾種方法可以做到這一點

但是讓你的加盟表達正確的,你會想

IQueryable<Case> cases         //line:#1 
= Cases.Join(Folders.Where(f => f.ApplicationId == 1), //line:#2 
      c => c.folderId,       //line:#3 
      f => f.folderId,       //line:#4 
      (f,c) => c);        //line:#5 

說明:

。加入需要四個參數(詳見MSDN

  • 1st是您加入的集合2(如上面的第2行)。只希望已的applicationID等於1的文件夾的子集,因此.Where(f => f.ApplicationId == 1)
  • 第二是識別所外集合中的接合上(例)的鍵(如在以上第3行)
  • 表達3rd是一個表達式,用於標識內部集合(文件夾)中加入的密鑰(如上面的第4行)
  • 4th是一個表達式,用於從2個連接的集合中選擇結果。這個表達式的左邊需要兩個參數來表示連接的兩邊,右邊可以是這些的一些組合。(如上面5線)

我通常喜歡用LINQ表達式雖然喜歡:

var query = from c in Cases 
      join f in Folders on c.FolderId equals f.FolderId 
      where f.ApplicationId == 1 
      select c; 

認爲這是更具可讀性一點!

+0

感謝您的快速回復和工作答案! – user3770418

+0

不用擔心!如果這回答你的問題,那麼請將其標記爲答案。 –