Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这种额外的连接会增加查询?_C#_.net_Sql_Linq_Linq To Sql - Fatal编程技术网

C# 为什么这种额外的连接会增加查询?

C# 为什么这种额外的连接会增加查询?,c#,.net,sql,linq,linq-to-sql,C#,.net,Sql,Linq,Linq To Sql,我很难想出一个有效的LINQ到SQL查询。我正在尝试这样做: from x in Items select new { Name = x.Name TypeARelated = from r in x.Related where r.Type == "A" select r } 正如您所期望的,它从Items表生成一个查询,在相关表上有一个左连接。现在,如果我再添加一些类似的行 from x in It

我很难想出一个有效的LINQ到SQL查询。我正在尝试这样做:

from x in Items
select new
{
    Name = x.Name
    TypeARelated = from r in x.Related
                   where r.Type == "A"
                   select r
}
正如您所期望的,它从Items表生成一个查询,在相关表上有一个左连接。现在,如果我再添加一些类似的行

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中的每个记录对相关表进行单独查询。有没有一种方法可以在一个查询中完成这一切?这是什么原因?提前感谢您提供的任何帮助。

如果直接用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到sql的效率并不高,根据您的解释,它只进行一次连接,然后逐个比较每条记录。更好的方法是使用与第一个示例类似的两个linq查询,这将生成两个SQL查询。然后使用两个linq查询的结果并连接它们,这将不会生成任何SQL语句。此方法将SQL中执行的查询数限制为2

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


Hasanain

如果直接用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到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.
}

您可以使用即时加载在服务器上执行单个连接,以查看这是否有帮助。试试这个

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

    // Do your query now.
}