【问题标题】:LINQ to SQL: making a "double IN" query crashesLINQ to SQL:使“双输入”查询崩溃
【发布时间】:2010-04-01 01:04:19
【问题描述】:

我需要做以下事情:

var a = from c in DB.Customers 
        where (from t1 in DB.Table1 where t1.Date >= DataTime.Now 
               select t1.ID).Contains(c.ID) && 
              (from t2 in DB.Table2 where t2.Date >= DataTime.Now 
               select t2.ID).Contains(c.ID) 
        select c

它不想运行。我收到以下错误:

超时。超时时间 在完成之前经过 操作或服务器不 回应。

但是当我尝试运行时:

var a = from c in DB.Customers 
        where (from t1 in DB.Table1 where t1.Date >= DataTime.Now 
               select t1.ID).Contains(c.ID)
        select c

或者:

var a = from c in DB.Customers 
        where (from t2 in DB.Table2 where t2.Date >= DataTime.Now 
               select t2.ID).Contains(c.ID) 
        select c

有效!我确信这两个 IN 查询都包含一些客户 ID。

【问题讨论】:

    标签: asp.net-mvc linq linq-to-sql


    【解决方案1】:

    如果这是一个效率问题,最好查看 LINQ to SQL 生成的 SQL 查询(在调试模式下,将鼠标光标放在 a 上)。在任何情况下,您都可以尝试使用join 重写查询。像这样的东西应该可以解决问题:

    var a = from c in DB.Customers  
            join t1 in DB.Table1 on c.ID equals t1.ID
            join t2 in DB.Table2 on c.ID equals t2.ID
            where t1.Date >= DateTimeNow && t2.Date >= DateTimeNow 
            select c
    

    【讨论】:

    • 我不知道调试LINQ to SQL的这种简单方法!谢谢你。它创建 EXISTS 查询,并且再次加载太多。如果我只使用一个 EXISTS,它就可以工作。我会尝试找出问题所在,或者使用 JOIN 查询。有没有办法让它使用 IN 查询而不是 EXISTS 查询?
    • 我发现了问题。它按方法按我的 NEWID() 顺序排列,因为我想获得随机结果。当我删除它时,它工作正常。如何使用 NEWID()?
    【解决方案2】:

    它不一定会崩溃,而是可能会产生一个超时的低效查询。最好的做法是运行 SQL Server Profiler 以查看在 SQL 中发出的实际查询,然后对其进行一些分析。

    【讨论】:

      【解决方案3】:

      我发现了问题。它按方法按我的 NEWID() 顺序排列,因为我想获得随机结果。当我删除它时,它工作正常。如何使用 NEWID()?

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        相关资源
        最近更新 更多