【问题标题】:linq inner join sub query and conditional selectlinq 内连接子查询和条件选择
【发布时间】:2018-06-26 12:42:58
【问题描述】:

我有以下 sql select 语句,我正在尝试将其转换为 Linq:

SELECT a.lastname,a.firstname,a.program,a.[start],a.[end],
CASE WHEN a.[end] IS NULL AND a.[start] < c.lastStart THEN 1 ELSE 0 END as error,
CASE WHEN a.[end] IS NULL AND a.[start] = c.lastStart THEN 1 ELSE 0 END as loggedOn
FROM usagelog a 
INNER JOIN (SELECT b.username,max(b.[start]) AS lastStart FROM usagelog b GROUP BY b.username) c 
ON a.username = c.username
ORDER BY a.lastname, a.firstname,a.program,a.[start]

结果应如下所示:

SQL Results

到目前为止,我得到了以下内容:

var query = (from u in UsageLogs
             orderby u.lastname,u.firstname,u.program.u.start
             select new
             {
              lastname = u.lastname,
              firstname = u.firstname,
              program = u.program,
              start = u.start,
              end = u.end
              })

我不知道如何使用附加的 select 语句和“CASE”语句编写内部联接。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql entity-framework linq


    【解决方案1】:

    您可以使用 Lambda 表达式 group by,对于条件选择,请使用 内联条件,如下所示:

    var query = (from u in UsageLogs
                join c in (UsageLogs.GroupBy(r => r.username).Select(r => new {username = r.Key, lastStart = r.Max(p => p.start)))
                on u.username equals c.username
                orderby u.lastname,u.firstname,u.program.u.start
                select new
                {
                    lastname = u.lastname,
                    firstname = u.firstname,
                    program = u.program,
                    start = u.start,
                    end = u.end,
                    error = (u.end == NULL && u.start < c.lastStart) ? 1 : 0,
                    loggedOn = (u.end == NULL && u.start == c.lastStart) ? 1 : 0,
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 2023-03-24
      • 2021-05-13
      相关资源
      最近更新 更多