首页 > 解决方案 > linq 内连接子查询和条件选择

问题描述

我有以下要转换为 Linq 的 sql select 语句:

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 结果

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

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”语句编写内部连接。

任何帮助,将不胜感激。

标签: sqlentity-frameworklinq

解决方案


您可以使用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,
            });

推荐阅读