Linq到实体的非等联接
我必须使用IQueryable执行以下SQL命令:Linq到实体的非等联接,linq,join,iqueryable,entities,iequalitycomparer,Linq,Join,Iqueryable,Entities,Iequalitycomparer,我必须使用IQueryable执行以下SQL命令: SELECT * FROM myTable t1 INNER JOIN myTable t2 ON t1.time = t2.time + 1 OR t1.time = t2.time + 2 OR t1.time = t2.time + 3; LINQtoEntities不允许我使用IEqualityComparer,所以我正在寻找某种方法来实现这种连接 必须使用IQueryable,并且不能通
SELECT * FROM myTable t1
INNER JOIN myTable t2 ON t1.time = t2.time + 1
OR t1.time = t2.time + 2
OR t1.time = t2.time + 3;
LINQtoEntities不允许我使用IEqualityComparer,所以我正在寻找某种方法来实现这种连接
必须使用IQueryable,并且不能通过Where放置条件,因为myTable有数百万条记录,执行速度非常慢:
qry = qry.Join(...).Where(...);
我需要
qry = qry.Join(...);
是否有类似IEqualityComparer的替代方案用于Linq到实体
谢谢大家!!
对不起,我的英语不好 我不确定这是否适用于Lambda表达式,但您可以使用Linq实现这一点:
var l = from i1 in conn.List1
from i2 in conn.List2
where
(
i1.time == i2.Time + 1
|| i1.time == i2.Time + 2
|| i1.time == i2.Time + 3
)
select new { i1, i2 }
还可以尝试以下操作:
var l = from i2 in conn.List2.Where(x => i1.time == x.Time + 1
|| i1.time == x.Time + 2
|| i1.time == x.Time + 3)
select new { i1, i2 }
Linq只支持equi联接,因此需要通过where子句来实现 也就是说,我不希望复合内部联接与使用
where
子句之间有显著的性能差异,SQL应该为以下两个查询创建类似(如果不相等)的计划:
SELECT *
FROM myTable t1
INNER JOIN myTable t2 ON t1.time = t2.time + 1
OR t1.time = t2.time + 2
OR t1.time = t2.time + 3;
SELECT *
FROM myTable t1 ,
myTable t2
WHERE t1.time = t2.time + 1
OR t1.time = t2.time + 2
OR t1.time = t2.time + 3;
我需要在哪里使用IQueryable,而不是在哪里使用IQueryable。数据库中有数百万条记录,如果我这样做的话,连接后需要花费很长时间才能完成连接。你能试试第二种解决方案吗?