Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# 如何将此内部联接子查询从SQL重新写入Lambda_C#_.net_Sql_Linq To Sql_Lambda - Fatal编程技术网

C# 如何将此内部联接子查询从SQL重新写入Lambda

C# 如何将此内部联接子查询从SQL重新写入Lambda,c#,.net,sql,linq-to-sql,lambda,C#,.net,Sql,Linq To Sql,Lambda,每天可以有许多“设备状态”更新被审核到此登录表中。此查询返回每天最后一个唯一的查询 我想把它改写成一个Lambda语句。这就是我走了多远,我不知道我是否在正确的轨道上,我的Max()抛出了一个类型错误,可能是因为group by正在制作另一个列表或其他什么。。。 希望您能从我的对象示例中找到答案….: SELECT ulcch.ID, ulcch.UserLoginHistoryID, ulcch.StatusID, ulcch.ClientModuleID, ulcch.Device

每天可以有许多“设备状态”更新被审核到此登录表中。此查询返回每天最后一个唯一的查询

我想把它改写成一个Lambda语句。这就是我走了多远,我不知道我是否在正确的轨道上,我的
Max()
抛出了一个类型错误,可能是因为group by正在制作另一个列表或其他什么。。。 希望您能从我的对象示例中找到答案….:

SELECT     ulcch.ID, ulcch.UserLoginHistoryID, ulcch.StatusID, 
ulcch.ClientModuleID, ulcch.DeviceState, ulcch.UpdatedAt, ulcch.CreatedAt
FROM         UserLoginClientConnectionHistory AS ulcch INNER JOIN
  (SELECT     MAX(CreatedAt) AS maxCreatedAt
    FROM          UserLoginClientConnectionHistory AS ulcch1
    GROUP BY UserLoginHistoryID) AS m ON m.maxCreatedAt = ulcch.CreatedAt

这是作为lambda的内部连接部分。我以为CreatedAt是约会时间

UserLoginClientConnectionHistory .GroupBy(ulcch1=> 新的
{ Name=ulcch1.Name }) .选择(g=> 新的
{ maxCreatedAt=(日期时间?)(g.Max(p=>p.CreatedAt))
})

这是作为lambda的内部连接部分。我以为CreatedAt是约会时间

UserLoginClientConnectionHistory .GroupBy(ulcch1=> 新的
{ Name=ulcch1.Name }) .选择(g=> 新的
{ maxCreatedAt=(日期时间?)(g.Max(p=>p.CreatedAt))
})

我想您应该按照
CreatedAt
而不是
UserLoginHistoryID
进行分组:

userLogin.UserLoginClientConnectionHistories.Where(x => x.CreatedAt ==
  userLoginClientConnectionHistoryRepository.GetAll(
    GenericStatus.Active).GroupBy(y => y.UserLoginHistoryID).Max(y => y.CreatedAt));

这将返回共享最新的
CreatedAt
值的
UserLoginClientConnectionHistory
项集。

我认为您希望按
CreatedAt
分组,而不是按
UserLoginHistoryID
分组:

userLogin.UserLoginClientConnectionHistories.Where(x => x.CreatedAt ==
  userLoginClientConnectionHistoryRepository.GetAll(
    GenericStatus.Active).GroupBy(y => y.UserLoginHistoryID).Max(y => y.CreatedAt));

这将返回一组
UserLoginClientConnectionHistory
条目,这些条目共享最新的
CreatedAt
值。

感谢大家的帮助,我投票支持你们,但你们不会相信,但几个小时后,我搜索了一个将SQL转换为LINQ的程序,出乎意料地发现了一个名为“”的程序。听起来很疯狂,也没想到能走多远,但它工作得很好。。如果其他人被困在同一条船上,绝对值得一看这个应用程序

检查它返回的庞大查询!分析后,你不觉得它有多余的膨胀吗?有人有任何优化技巧或发现任何不必要的代码吗

var q = userLogin.UserLoginClientConnectionHistories
            .GroupBy(h => h.CreatedAt)
            .OrderByDescending(g => g.Key) // Sort by CreatedAt
            .First()
            .Select(h => new { h.Id, h.UserLoginHistoryID, ... });
感谢您的帮助dahlbyk,但我确实想在UserLoginHistoryID上分组,在深入研究lambda等价物之前,我已经用SQL确认了我的查询:)谢谢


@Mark感谢您抽出时间回复,是的,我每天都会按照每个用户的[last]条目(userloginhistory..它反过来包含一个用户ID)进行操作,并且将我的sql导出到linq查询中确实产生了我想要的结果(可以在下面的查询结果中看到;这就是我想要的。您每天看到两个条目的原因是因为还有附加的ClientModule。所以我真的想要所有的客户端模块,每天每个登录条目-通过讨论论坛argh很难获得编程要求!)也许你的代码做了完全相同的事情(如果我正确地阅读了你的输出,看起来是这样的),只是简化了很多

看,我对你在那里用
GroupBy
Select
所做的anon casting不太了解,但现在我明白了,这是有意义的。我可能会试试你的。希望我能给它一个调整,每天也包括不同的ClientModule。所以不管怎样..这是我的SQL查询结果,也是我通过m得到的y-own lambda:

        moduleDeviceStates = from ulh in user.UserLoginHistories
                             join ulcch in userLogin.UserLoginClientConnectionHistories on new { ID = ulh.ID } equals new { ID = ulcch.UserLoginHistoryID }
                             join cm in clientModuleRepository.GetAll(GenericStatus.Active) on new { ClientModuleID = ulcch.ClientModuleID } equals new { ClientModuleID = cm.ID }
                             join mo in moduleRepository.GetAll(GenericStatus.Active) on new { ModuleID = cm.ModuleID } equals new { ModuleID = mo.ID }
                             join m in
                                 (
                                     (from ulcch1 in userLogin.UserLoginClientConnectionHistories
                                      group ulcch1 by new
                                      {
                                          ulcch1.UserLoginHistoryID
                                      } into g
                                      select new
                                      {
                                          maxCreatedAt = g.Max(p => p.CreatedAt)
                                      })) on new { maxCreatedAt = ulcch.CreatedAt } equals new { maxCreatedAt = m.maxCreatedAt }
                             select new ModuleDeviceState()
                             {
                                 ModuleID = mo.ID,
                                 Name = mo.Name,
                                 DeviceState = (State.DeviceState)ulcch.DeviceState,
                                 CreatedAt = ulcch.CreatedAt
                             };

更新标记:您好,在对您的查询进行两次调整后,我可以在.NET中的两个lambda语句之间生成相同的对象图。这是我现在将使用的对象图,源于您的对象图,因为它比自动生成的对象图更精简、更易于理解,我将为您打分:)

由于我的
ModuleDeviceEstate
类需要这些条目,因此我在组中添加了一些条目

ID  UserLoginHistoryID  StatusID    ClientModuleID  DeviceState UpdatedAt   CreatedAt
277 62  1   1   4   NULL    2009-10-31 13:28:59.003
278 62  1   16  4   NULL    2009-10-31 13:28:59.003
331 65  1   1   4   NULL    2009-10-31 17:13:28.333
332 65  1   16  4   NULL    2009-10-31 17:13:28.333

感谢大家的帮助,我投票支持你们,但你们不会相信,但几个小时后,我搜索了一个将SQL转换为LINQ的程序,出乎意料地发现了一个名为“”的程序。听起来很疯狂,也没想到能走多远,但它工作得很好。。如果其他人被困在同一条船上,绝对值得一看这个应用程序

检查它返回的庞大查询!分析后,你不觉得它有多余的膨胀吗?有人有任何优化技巧或发现任何不必要的代码吗

var q = userLogin.UserLoginClientConnectionHistories
            .GroupBy(h => h.CreatedAt)
            .OrderByDescending(g => g.Key) // Sort by CreatedAt
            .First()
            .Select(h => new { h.Id, h.UserLoginHistoryID, ... });
感谢您的帮助dahlbyk,但我确实想在UserLoginHistoryID上分组,在深入研究lambda等价物之前,我已经用SQL确认了我的查询:)谢谢


@Mark感谢您抽出时间回复,是的,我每天都会按照每个用户的[last]条目(userloginhistory..它反过来包含一个用户ID)进行操作,并且将我的sql导出到linq查询中确实产生了我想要的结果(可以在下面的查询结果中看到;这就是我想要的。您每天看到两个条目的原因是因为还有附加的ClientModule。所以我真的想要所有的客户端模块,每天每个登录条目-通过讨论论坛argh很难获得编程要求!)也许你的代码做了完全相同的事情(如果我正确地阅读了你的输出,看起来是这样的),只是简化了很多

看,我对你在那里用
GroupBy
Select
所做的anon casting不太了解,但现在我明白了,这是有意义的。我可能会试试你的。希望我能给它一个调整,每天也包括不同的ClientModule。所以不管怎样..这是我的SQL查询结果,也是我通过m得到的y-own lambda:

        moduleDeviceStates = from ulh in user.UserLoginHistories
                             join ulcch in userLogin.UserLoginClientConnectionHistories on new { ID = ulh.ID } equals new { ID = ulcch.UserLoginHistoryID }
                             join cm in clientModuleRepository.GetAll(GenericStatus.Active) on new { ClientModuleID = ulcch.ClientModuleID } equals new { ClientModuleID = cm.ID }
                             join mo in moduleRepository.GetAll(GenericStatus.Active) on new { ModuleID = cm.ModuleID } equals new { ModuleID = mo.ID }
                             join m in
                                 (
                                     (from ulcch1 in userLogin.UserLoginClientConnectionHistories
                                      group ulcch1 by new
                                      {
                                          ulcch1.UserLoginHistoryID
                                      } into g
                                      select new
                                      {
                                          maxCreatedAt = g.Max(p => p.CreatedAt)
                                      })) on new { maxCreatedAt = ulcch.CreatedAt } equals new { maxCreatedAt = m.maxCreatedAt }
                             select new ModuleDeviceState()
                             {
                                 ModuleID = mo.ID,
                                 Name = mo.Name,
                                 DeviceState = (State.DeviceState)ulcch.DeviceState,
                                 CreatedAt = ulcch.CreatedAt
                             };

更新标记:您好,在对您的查询进行两次调整后,我可以在.NET中的两个lambda语句之间生成相同的对象图。这是我现在将使用的对象图,源于您的对象图,因为它比自动生成的对象图更精简、更易于理解,我将为您打分:)

由于我需要为我的
ModuleDeviceStateUser 1, day 01-01-2009 00:00:00, most recent 01-01-2009 15:00:00
User 1, day 03-01-2009 00:00:00, most recent 03-01-2009 11:00:00
User 2, day 03-01-2009 00:00:00, most recent 03-01-2009 05:00:00