【问题标题】:Linq to Entities Non-Equal JoinLinq to Entity Non-Equal Join
【发布时间】:2013-11-20 07:37:51
【问题描述】:

我必须使用 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(...);

有没有像 IEqualityComparer 这样的 Linq to Entities 替代方案?

谢谢! 对不起我的英语不好!

【问题讨论】:

    标签: linq join iqueryable entities iequalitycomparer


    【解决方案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 }
    

    【讨论】:

    • 我需要使用而不是使用 IQueryable Where。数据库有数百万条记录,如果我在 Join 之后执行 Where 需要永远完成 Join。
    • 你能试试第二种方案吗?
    【解决方案2】:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-24
      • 2012-10-26
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多