sql - 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]
结果应如下所示:
到目前为止,我有以下内容:
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”语句编写内部连接。
任何帮助,将不胜感激。
解决方案
您可以使用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,
});
推荐阅读
- c++ - 在聚合初始化中使用结构
- java - 使用 JavaFX 的观察者模式和条形图的问题
- mysql - 用于仅使用星号计算数字类型列的聚合值的 SQL 查询
- java - 无法从用户那里得到“再次计算”来工作
- android - 如何制作在平板电脑和安卓设备上相同的响应式 recyclerView
- sql - ORA-00922: 创建表时选项丢失或无效
- spring - Spring Boot @Autowired by generic 不适用于 @InjectMocks
- android - 如何在戴尔灵越 3542 上调试安卓应用程序?
- css - 在静态文件中链接 CSS 文件并将其用于所有文件夹甚至子文件夹
- r - 从字符串中删除超过 4 位的数字