Linq到实体的非等联接

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,并且不能通

我必须使用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,并且不能通过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。数据库中有数百万条记录,如果我这样做的话,连接后需要花费很长时间才能完成连接。你能试试第二种解决方案吗?