gpt4 book ai didi

c# - 如何在 Linq 上获得左连接

转载 作者:行者123 更新时间:2023-11-29 19:38:27 25 4
gpt4 key购买 nike

我对加入有这个查询。这给了我一个内部连接。我想要完成的是左连接。我尝试使用 DefaultIfEmpty() 但无法让它工作。也许我把它放在查询的错误部分。

有人能指出我使用 DefaultIfEmpty() 的正确方法吗?

以下是我当前的查询:

var AppList = (de.ComputerUserApplication)
.Where(CUA => CUA.EmployeeID == employeeID)
.DefaultIfEmpty()
.Join(de.ApplicationTypeMasters,
CUA => CUA.RecordType,
ATM => ATM.Code,
(CUA, ATM) => new ApplicationModel
{
ApplicationNo = CUA.ApplicationNo,
ApplicationCode = CUA.RecordType,
ApplicationTypeCode = "",
ApplicationName = ATM.Title + " - " + CUA.Description,
Status = CUA.Status
});

此外,我不太确定我的查询是否正确。如果可以的话,以下是我原来的查询:

select Cua_ApplicationNo, Cua_Type_Rec, ATM_ApplicationTitle, Cua_Status  from ComputerUserApplication
left join ApplicationTypeMaster
on Cua_Type_Rec = ATM_ApplicationCode
where Cua_EmployeeID = 'someID'

最佳答案

您需要使用GroupJoin for an outer join ;假设有 0 或 1 个匹配的 ApplicationTypeMaster 行,这将起作用;如果更多,那么您需要执行 DefaultIfEmpty ,然后执行 SelectMany

de.ComputerUserApplication
.Where(x => x.EmployeeID == employeeID)
.GroupJoin(
de.ApplicationTypeMasters,
CUA => CUA.RecordType,
ATM => ATM.Code,
(CUA, ATM) => new ApplicationModel
{
ApplicationNo = CUA.ApplicationNo,
ApplicationCode = CUA.RecordType,
ApplicationTypeCode = "",
ApplicationName = ATM.SingleOrDefault()?.Title + " - " + CUA.Description,
Status = CUA.Status
}
);

如果您不知道有多少匹配行,则 SelectMany 将为您提供与 SQL 等效的结果:

de.ComputerUserApplication
.Where(x => x.EmployeeID == employeeID)
.GroupJoin(
de.ApplicationTypeMasters,
CUA => CUA.RecordType,
ATM => ATM.Code,
(x, y) => new { CUA = x, ATMs = y.DefaultIfEmpty() }
).SelectMany(x => x.ATMs.Select(ATM => new ApplicationModel
{
ApplicationNo = x.CUA.ApplicationNo,
ApplicationCode = x.CUA.RecordType,
ApplicationTypeCode = "",
ApplicationName = ATM?.Title + " - " + x.CUA.Description,
Status = x.CUA.Status
}
);

顺便说一句,这是我为数不多的更喜欢查询语法的情况之一(它在没有任何噪音的情况下执行 SelectMany):

  from CUA in de.ComputerUserApplication
join x in de.ApplicationTypeMasters on CUA.RecordType equals x.Code into g
from ATM in g.DefaultIfEmpty()
select new ApplicationModel()
{
ApplicationNo = CUA.ApplicationNo,
ApplicationCode = CUA.RecordType,
ApplicationTypeCode = "",
ApplicationName = ATM?.Title + " - " + CUA.Description,
Status = CUA.Status
};

关于c# - 如何在 Linq 上获得左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41455771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com