【问题标题】:Why does this additional join increase # of queries?为什么这个额外的连接会增加查询数?
【发布时间】:2011-05-25 21:05:22
【问题描述】:

我无法提出高效的 LINQ-to-SQL 查询。我正在尝试做这样的事情:

from x in Items
select new
{
    Name = x.Name
    TypeARelated = from r in x.Related
                   where r.Type == "A"
                   select r
}

如您所料,它会从“Items”表生成一个查询,并在“Related”表上进行左连接。现在,如果我再添加几行类似的行...

from x in Items
select new
{
    Name = x.Name
    TypeARelated = from r in x.Related
                   where r.Type == "A"
                   select r,
    TypeBRelated = from r in x.Related
                   where r.Type == "B"
                   select r
}

结果是运行与第一次尝试类似的查询,然后对“项目”中的每条记录的“相关”表进行单独查询。有没有办法将这一切都包含在一个查询中?这会是什么原因?提前感谢您提供的任何帮助。

【问题讨论】:

    标签: c# .net sql linq linq-to-sql


    【解决方案1】:

    上面的查询如果直接用 SQL 写成这样(伪代码):

    SELECT 
        X.NAME AS NAME,
        (CASE R.TYPE WHEN A THEN R ELSE NULL) AS TypeARelated,
        (CASE R.TYPE WHEN B THEN R ELSE NULL) AS TypeBRelated
    FROM Items AS X
    JOIN Related AS R ON <some field>
    

    但是,linq-to-sql 效率不高,根据您的解释,它执行一次连接,然后单独比较每条记录。更好的方法是使用两个类似于您的第一个示例的 linq 查询,这将生成两个 SQL 查询。然后使用两个 linq 查询的结果并将它们连接起来,这不会生成任何 SQL 语句。此方法会将 SQL 中执行的查询数限制为 2。

    如果 ierType == "A" 等条件的数量会随着时间的推移而增加,或者要添加不同的条件,则最好使用存储过程,这将是一个 SQL 查询在任何时候。

    哈桑

    【讨论】:

      【解决方案2】:

      您可以使用预先加载在服务器上进行一次连接,看看是否有帮助。试试这个。

      using (MyDataContext context = new MyDataContext())
      {
          DataLoadOptions options = new DataLoadOptions();
          options.LoadWith<Item>(i => i.Related);
          context.LoadOptions = options;
      
          // Do your query now.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 2015-02-21
        • 2013-09-29
        • 1970-01-01
        • 1970-01-01
        • 2013-01-13
        • 2020-10-08
        相关资源
        最近更新 更多