Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# 在LINQ中提高联合查询的效率_C#_Linq - Fatal编程技术网

C# 在LINQ中提高联合查询的效率

C# 在LINQ中提高联合查询的效率,c#,linq,C#,Linq,我目前正在从事一个利用EF的项目,我想知道是否有一种更有效或更干净的方法来处理我下面的内容 在SQL Server中,我可以通过以下操作获得所需的数据: SELECT tbl2.* FROM dbo.Table1 tbl INNER JOIN dbo.Table2 tbl2 ON tbl.Column = tbls2.Colunm WHERE tbl.Column2 IS NULL UNION SELECT * FROM dbo.Table2 WHERE Column2 = value

我目前正在从事一个利用EF的项目,我想知道是否有一种更有效或更干净的方法来处理我下面的内容

在SQL Server中,我可以通过以下操作获得所需的数据:

SELECT tbl2.* FROM 
dbo.Table1 tbl
INNER JOIN dbo.Table2 tbl2 ON tbl.Column = tbls2.Colunm
WHERE tbl.Column2 IS NULL 

UNION

SELECT * FROM 
dbo.Table2
WHERE Column2 = value 
var results1 = Repository.Select<Table>()
            .Include(t => t.Table2)
            .Where(t => t.Column == null);

var table2Results = results1.Select(t => t.Table2);
var results2 = Repository.Select<Table2>().Where(t => t.Column2 == "VALUE");

table2Results  = table2Results.Concat(results2);

return results2.ToList();
非常直截了当。然而,在LINQ中,我有一些东西看起来像这样:

SELECT tbl2.* FROM 
dbo.Table1 tbl
INNER JOIN dbo.Table2 tbl2 ON tbl.Column = tbls2.Colunm
WHERE tbl.Column2 IS NULL 

UNION

SELECT * FROM 
dbo.Table2
WHERE Column2 = value 
var results1 = Repository.Select<Table>()
            .Include(t => t.Table2)
            .Where(t => t.Column == null);

var table2Results = results1.Select(t => t.Table2);
var results2 = Repository.Select<Table2>().Where(t => t.Column2 == "VALUE");

table2Results  = table2Results.Concat(results2);

return results2.ToList();

那么,有没有一种更干净/更有效的方法来实现我所描述的?谢谢

一个问题是,结果可能返回的数据与原始SQL查询的数据不同<代码>联合将选择不同的值,
联合所有
将选择所有值。首先,我认为您的代码可以变得更加清晰,如下所示:

// Notice the lack of "Include". "Include" only states what should be returned
// *with* the original type, and is not necessary if you only need to select the
// individual property.
var firstResults = Repository.Select<Table>()
                             .Where(t => t.Column == null)
                             .Select(t => t.Table2);

var secondResults = Repository.Select<Table2>()
                              .Where(t => t.Column2 == "Value");

return firstResults.Union(secondResults);
//注意缺少“Include”。“包含”仅说明应返回的内容
//*使用*原始类型,如果只需要选择
//个人财产。
var firstResults=Repository.Select()
.Where(t=>t.Column==null)
.选择(t=>t.Table2);
var secondResults=Repository.Select()
。式中(t=>t.Column2==“值”);
返回firstResults.Union(secondResults);
如果您知道在这个查询中不可能有重复项,请在最后一行使用
Concat
(这将生成您在当前代码中看到的
UNION ALL
),原因将详细描述。如果您想要类似于原始查询的内容,请继续使用上例中的
Union


重要的是要记住,LINQtoEntities并不总是能够生成您想要的SQL,因为它必须以通用方式处理如此多的情况。使用EF的好处是,它使您的代码更具表现力、更清晰、强类型化,等等。因此,您应该首先考虑可读性。然后,如果在剖析时实际上看到性能问题,那么您可能需要考虑替代方法来查询数据。如果您先分析这两个查询,那么您可能根本不关心这个问题的答案。

至此,这段代码更加简洁,运行良好,谢谢!就你上一段所说,我没有把生成的SQL作为针对EF或任何东西的关键点;我提供它仅仅是为了这个问题。正如您所指出的,我唯一一次真正分析SQL的时候是看到不必要的减速。谢谢