Linq to Entities Non-Equal Join

时间:2013-11-20 07:37:51

标签: 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;

Linq to Entities不允许我使用IEqualityComparer,所以我正在寻找一些方法来完成这个Join。

必须使用IQueryable并且不能通过where来设置条件myTable有数百万条记录并且实现速度非常慢:

qry = qry.Join(...).Where(...);

我需要

qry = qry.Join(...);

是否存在类似于Linq to Entities的IEqualityComparer等替代方案?

谢谢! 对不起,我的英文不好!

2 个答案:

答案 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;