c# - 代替左连接的 Lambda 表达式
问题描述
我尝试将 T-SQL 转换为 lambda 表达式,但遇到了问题。数据不正确。
这是我的查询
SELECT A.*
FROM
(SELECT UserId, MIN(ID) AS ID
FROM FingerMachineUsers
GROUP BY UserId ) A
LEFT OUTER JOIN
FingerTimeSheets B ON A.ID = B.UserNo
AND B.DayOfCheck = '2018-08-02 00:00:00.000'
WHERE
B.UserNo IS NULL
这是我的 lambda 表达式
dbContext.FingerMachineUsers
.GroupBy(x => x.UserId)
.Select(g => new { ID = g.Min(p => p.ID), UserId=g.Select(p => p.UserId) })
.GroupJoin(dbContext.FingerTimeSheets.Where(x=>x.DayOfCheck==shortDate),x=>x.ID,y=>y.UserNo,(x,y)=> new { ID = x, UserNo = y })
.SelectMany(x=>x.UserNo.DefaultIfEmpty(),(x,y)=>new { x.ID,y.UserNo});
返回的数据不正确。
解决方案
linq 查询应该是:
DateTime date = DateTime.Today;
var innerQuery = from x in db.FingerMachineUsers
group x.UserId by x.UserId into y
select new { UserId = y.Key, ID = y.Min() };
var query = from x in innerQuery
join y in db.FingerTimeSheets on x.ID equals y.UserNo into z
from y in z.Where(a => a.DayOfCheck == date).DefaultIfEmpty()
where y == null || y.UserNo == null
select x;
该查询或多或少等同于:
SELECT
[GroupBy1].[K1] AS [UserId],
[GroupBy1].[A1] AS [C1]
FROM (SELECT
[Extent1].[UserId] AS [K1],
MIN([Extent1].[UserId]) AS [A1]
FROM [dbo].[FingerMachineUsers] AS [Extent1]
GROUP BY [Extent1].[UserId] ) AS [GroupBy1]
LEFT OUTER JOIN [dbo].[FingerTimeSheets] AS [Extent2] ON (([GroupBy1].[A1] = [Extent2].[UserNo]) OR (([GroupBy1].[A1] IS NULL) AND ([Extent2].[UserNo] IS NULL))) AND ([Extent2].[DayOfCheck] = @p__linq__0)
WHERE [Extent2].[TimeSheetId] IS NULL OR [Extent2].[UserNo] IS NULL
(TimeSheetId
的主键在哪里FingerTimeSheets
)
FingerTimeSheets.UserNo
关于 的可空性和 的含义有一些开放的观点B.UserNo IS NULL
。可以为FingerTimeSheets.UserNo
空吗?然后查询是正确的。如果FingerTimeSheets.UserNo
不可为空,则将其更改where
为:
where y == null
另一个需要解决的小问题是两者FingerMachineUsers.ID
是否都可以为FingerTimeSheets.UserNo
空。将 moddile 更改from y in z.Where()
为:
from y in z.Where(a => UserNo != null && a.DayOfCheck == date).DefaultIfEmpty()
推荐阅读
- chatbot - 如何连接 Bitrix24 聊天机器人
- cisco-ios - 将 CLI 输出加载到 Cisco Genie/pyats 解析器?
- jquery - :contains() 选择器 - 如何忽略区分大小写?
- javascript - 如何使用 let 和 async 将 deepai 输出 blob 保存到文件
- react-native - 世博会加密存储信用卡信息是否安全?
- qt - MouseMoveEvent 停止被调用
- c++ - 从类中的模板函数调用模板函数
- javascript - 使用 JavaScript 删除字符串空格、回车、换行和制表符
- python - 将系列转换为数据框并重命名
- powershell - How to change the URL in an Edge tab with Powershell