C# 在LINQ中提高联合查询的效率
我目前正在从事一个利用EF的项目,我想知道是否有一种更有效或更干净的方法来处理我下面的内容 在SQL Server中,我可以通过以下操作获得所需的数据: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
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的时候是看到不必要的减速。谢谢