我必须使用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;
Linq to Entities不允许我使用IEqualityComparer,所以我正在寻找一些方法来完成这个Join。
必须使用IQueryable并且不能通过where来设置条件myTable有数百万条记录并且实现速度非常慢:
qry = qry.Join(...).Where(...);
我需要
qry = qry.Join(...);
是否存在类似于Linq to Entities的IEqualityComparer等替代方案?
谢谢! 对不起,我的英文不好!
答案 0 :(得分:1)
我不确定这是否适用于Lambda-Expression,但您可以使用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 }
答案 1 :(得分:0)
Linq仅支持equi-joins,因此您需要通过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;