【问题标题】:Is there a way to write this LINQ query using lambda expressions?有没有办法使用 lambda 表达式编写这个 LINQ 查询?
【发布时间】:2023-03-26 11:23:01
【问题描述】:

我有一个 linq 查询,用于使用 2 个连接从 3 个表中获取数据。我更愿意把它写成 lambda 表达式,这样我的团队会发现它更具可读性。有没有办法做到这一点?我找不到任何像样的例子。

var q = (
     from sus in susManager.Get()
     join su in suManager.Get() on sus.SUId equals su.Id
     join p in pManager.Get() on su.PId equals p.Id
     where sus.EndTimeStamp >= oneDayAgo
     select new
     {
         Name = p.FirstName + " " + p.LastName,
         Email = su.Email,
         LastLogIn = sus.StartTimeStamp,
         LastSessionDurationInMinutes = 
             DbFunctions.DiffMinutes(sus.StartTimeStamp, sus.EndTimeStamp),
         LastActive = sus.EndTimeStamp
     }).ToList();

【问题讨论】:

  • Lambda 表达式在任何客观标准下都不具有更高的可读性。查询语法也被称为“理解语法”是有原因的。
  • @GertArnold 我只是遵循公司的风格指南。
  • 这样的风格指南是无稽之谈。没有人可以强迫开发人员放弃可读代码。

标签: c# entity-framework linq lambda webforms


【解决方案1】:

假设 Get() 函数返回 Lists,则 lambda 等效项如下所示:

var q = systemUserSessionManager.Get()
    .Where(sus => sus.EndTimeStamp >= oneDayAgo)
    .Join(systemUserManager.Get(), 
        sus => sus.SystemUserId, 
        su => su.Id, 
        (sus, su) => new { sus, su })
    .Join(personManager.Get(), 
        j => j.su.PersonId, 
        p => p.Id, 
        (j, p) => new { sus = j.sus, su = j.su, p })
    .Select(x => new
    {
        Name = p.FirstName + " " + p.LastName,
        Email = su.Email,
        LastLogIn = sus.StartTimeStamp,
        LastSessionDurationInMinutes = 
            DbFunctions.DiffMinutes(sus.StartTimeStamp, sus.EndTimeStamp),
        LastActive = sus.EndTimeStamp
    })
    .ToList();

【讨论】:

    【解决方案2】:

    试试这样的

    var q = (
         from sus in systemUserSessionManager.Get()
         join su in systemUserManager.Get() on sus.SystemUserId equals su.Id
         join p in personManager.Get() on su.PersonId equals p.Id
         select new { sus = sus, su = su, p = p})
         .Where(x => x.sus.EndTimeStamp >= oneDayAgo)
         .Select(x => new {
             Name = x.p.FirstName + " " + x.p.LastName,
             Email = x.su.Email,
             LastLogIn = x.sus.StartTimeStamp,
             LastSessionDurationInMinutes = 
                 DbFunctions.DiffMinutes(x.sus.StartTimeStamp, x.sus.EndTimeStamp),
             LastActive = x.sus.EndTimeStamp
         }).ToList();
    

    【讨论】:

    • 我没有投反对票,但我假设这是因为您还没有将所有查询语法转换为 lambda 表达式。
    • 我的偏好是离开加入,如图所示。它更容易阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多