为什么这个额外的联接会增加查询数



我很难想出一个高效的LINQ到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"表执行单独的查询。有没有一种方法可以将这一切封装在一个查询中?造成这种情况的原因是什么?提前感谢您提供的任何帮助。

如果直接用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。

如果条件的数量,即r.Type=="A"等,将随着时间的推移而增加,或者将添加不同的条件,则最好使用存储过程,它将始终是一个SQL查询。

Hasanain

您可以使用热切加载在服务器上执行单个联接,看看这是否有帮助。试试看。

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

最新更新