为什么这个额外的连接会增加查询次数?

时间:2011-05-25 21:05:22

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

我无法提出有效的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
}

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

2 个答案:

答案 0 :(得分:3)

如果直接在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查询在任何时候。

Hasanain

答案 1 :(得分:1)

您可以使用预先加载来在服务器上执行单个联接,以查看是否有帮助。试一试。

using (MyDataContext context = new MyDataContext())
{
    DataLoadOptions options = new DataLoadOptions();
    options.LoadWith<Item>(i => i.Related);
    context.LoadOptions = options;

    // Do your query now.
}