查询我的实体框架db时,我正在尝试根据2行的值匹配条件。
我当前的查询看起来像这样:
var query = context.table.where(x => x.row > 2);
这一切都很好。
我现在想实现的是根据当前和下一行中的值查询表:
var query = context.table.where(x => x.row > 2 && x.row[next row up in DB] < 2);
可以做到这一点。
我知道我可以在代码中实现这一目标,但是可以在单个查询中使用LINQ和实体来完成吗?
这是我如何使用SQL进行此操作的一个示例:
SELECT *
FROM t_Table p
INNER JOIN t_Table f
ON (p.id + 1) = f.id
WHERE p.column = whatever
AND f.column = whatever2
将您的样本SQL转换为SQL:
var ans = from p in t_table
from f in t_table
where (p.id+1) == f.id && p.column == whatever && f.column == whatever2
select new { p, f };
这似乎并不是在SQL中生成内部连接,而是一个交叉加入,但我认为SQL引擎会适当处理它。请注意,linq只能进行等电量。
我没有意识到您可以在LINQ加入中的某些表达式,只要是主要操作员,这会产生一个子选择和内部连接,这似乎更快了:
var ans = from p in t_table
where p.column == whatever
let pidplus1 = p.id+1
join f in t_table on pidplus1 equals f.id
where f.column == whatever2
select new { p, f };