左连接使用Linq和Lambda表达式返回Left表

时间:2014-06-24 09:17:33

标签: sql linq lambda left-join

我尝试创建一个Lambda表达式来获取特定应用程序中文件夹中的每个Case。 我有2张桌子:

表1:案例

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

table2:文件夹

FolderId | ApplicationId
0          1
1          1
2          1
3          2

我想在ApplicationId 1的文件夹中返回每个案例。

结果:

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

我在这里找到了一个很好的Join表达式示例: 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'。

我尝试了

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

有人说它不起作用。 :(

提前致谢!!

1 个答案:

答案 0 :(得分: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

说明:

.Join有四个参数。 (有关完整说明,请参阅MSDN

  • 1st是您加入的集合2(如上面第2行所示)。您只希望ApplicationId等于1的文件夹子集,因此.Where(f => f.ApplicationId == 1)
  • 2nd是一个表达式,用于标识您在外部集合(案例)中加入的键(如上面第3行所示)
  • 3rd是一个表达式,用于标识您在内部集合(文件夹)中加入的键(如上面第4行所示)
  • 4th是一个表达式,用于选择2个已连接集合的结果。该表达式的左侧需要采用2个参数来表示连接的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;

认为这更具可读性!