【问题标题】:LINQ multiple joins with one left join带有一个左连接的 LINQ 多连接
【发布时间】:2015-12-28 19:31:15
【问题描述】:

我对 LINQ 相当陌生,我正在努力进行多重 JOIN。 所以,这就是我的数据库结构的样子:

现在,如果我有一个特定的成绩并且我想选择,我的查询应该是什么样子 {Student.IndexNo, GradeValue.Value},但是如果没有特定成绩和特定用户的成绩值,应该返回null(左连接)?

【问题讨论】:

  • 使用导航属性,没有连接。

标签: c# sql sql-server linq entity-framework


【解决方案1】:

获得 LEFT 连接的技巧是使用 DefaultIfEmpty() 方法:

var otherValue = 5;

var deps = from tbl1 in Table1
           join tbl2 in Table2
              on tbl1.Key equals tbl2.Key into joinGroup
           from j in joinGroup.DefaultIfEmpty()
           where 
               j.SomeProperty == "Some Value"
               && tbl1.OtherProperty == otherValue
           select j;

【讨论】:

  • 好的。所以现在我想选择 tbl2.SomeProperty,当 tbl2 为 null 时,我想获得 null(而不是 NullPointerException)。
  • @nme 使用三元运算符来测试您的值,如果有则返回该值,如果没有则返回 null。
【解决方案2】:

特意在 2015 年发布此内容,以供在 google hits 上寻找解决方案的新手使用。我设法破解和削减编程进入解决方案。

var projDetails = from r in entities.ProjekRumah
join d in entities.StateDistricts on r.ProjekLocationID equals d.DistrictID
join j in entities.ProjekJenis on r.ProjekTypeID equals j.TypeID
join s in entities.ProjekStatus on r.ProjekStatusID equals s.StatusID
join approvalDetails in entities.ProjekApproval on r.ProjekID equals approvalDetails.ProjekID into approvalDetailsGroup
from a in approvalDetailsGroup.DefaultIfEmpty()
select new ProjectDetailsDTO()
       {
        ProjekID = r.ProjekID,
        ProjekName = r.ProjekName,
        ProjekDistrictName = d.DistrictName,
        ProjekTypeName = j.TypeName,
        ProjekStatusName = s.StatusName,
        IsApprovalAccepted = a.IsApprovalAccepted ? "Approved" : "Draft",
        ProjekApprovalRemarks = a.ApprovalRemarks
};

在内部生成以下 SQL 代码

{SELECT [Extent1].[ProjekID] AS [ProjekID]
    ,[Extent1].[ProjekName] AS [ProjekName]
    ,[Extent2].[DistrictName] AS [DistrictName]
    ,[Extent3].[TypeName] AS [TypeName]
    ,[Extent4].[StatusName] AS [StatusName]
    ,CASE 
        WHEN ([Extent5].[IsApprovalAccepted] = 1)
            THEN N'Approved'
        ELSE N'Draft'
        END AS [C1]
    ,[Extent5].[ApprovalRemarks] AS [ApprovalRemarks]
FROM [dbo].[ProjekRumah] AS [Extent1]
INNER JOIN [dbo].[StateDistricts] AS [Extent2] ON [Extent1].[ProjekLocationID] = [Extent2].[DistrictID]
INNER JOIN [dbo].[ProjekJenis] AS [Extent3] ON [Extent1].[ProjekTypeID] = [Extent3].[TypeID]
INNER JOIN [dbo].[ProjekStatus] AS [Extent4] ON [Extent1].[ProjekStatusID] = [Extent4].[StatusID]
LEFT JOIN [dbo].[ProjekApproval] AS [Extent5] ON [Extent1].[ProjekID] = [Extent5].[ProjekID] 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多