Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda表达式代替左联接_C#_.net_Lambda - Fatal编程技术网

C# Lambda表达式代替左联接

C# Lambda表达式代替左联接,c#,.net,lambda,C#,.net,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.DayOfChe

我试图将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是空的
的含义,有一些开放的观点。
FingerTimeSheets.UserNo
是否可以为空?那么查询是正确的。如果
FingerTimeSheets.UserNo
不可为空,则将
where
更改为:

where y == null
from y in z.Where(a => UserNo != null && a.DayOfCheck == date).DefaultIfEmpty()
另一个需要解决的小问题是
FingerMachineUsers.ID
FingerTimeSheets.UserNo
是否都可以为空。将模态
从z中的y.Where()
更改为:

where y == null
from y in z.Where(a => UserNo != null && a.DayOfCheck == date).DefaultIfEmpty()

这是一个lambda(yes-b在d之前)表达式,而不是“lamda”…这里有一些工具可以避免类似的麻烦:Can
FingerTimeSheets.UserNo
be
NULL
b.UserNo为NULL
只意味着连接失败?