多个在哪里与内在联接

时间:2016-11-25 14:02:43

标签: c# sql-server linq join

我有一个过滤器,根据用户选择我有条件地添加更多Where / Joins。

哪种方法比另一种更快?为什么?

其中的示例:

var queryable = db.Sometable.Where(x=> x.Id > 30);
queryable = queryable.Where(x=> x.Name.Contains('something'));
var final = queryable.ToList();

加入示例:

var queryable1 = db.Sometable.Where(x=> x.Id > 30);
var queryable2 = db.Sometable.Where(x=> x.Name.Contains('something'));
var final = (from q1 in queryable1 join q2 in queryable2 on q1.Id equals q2.Id select q1).ToList();

注意:我会更喜欢多个Where,但它会导致错误,如question中所述。因此不得不转移到JOIN。希望'JOIN'代码不会慢于多个WHERE

3 个答案:

答案 0 :(得分:2)

我刚尝试对1000万行的MSsql 2008数据库表运行类似的linq语句。我发现查询优化器将两个语句都转换为类似的查询计划,性能差异很大。

我会说,作为正在阅读代码的人,第一个例子更清楚地表明了你的意图,因此会更受欢迎。很多时候,性能不是评估代码时选择的最佳指标。

答案 1 :(得分:0)

我确信您已经明白LINQ会将您的代码转换为SQL语句。您的第一个查询将导致类似:

SELECT * FROM Sometable WHERE Id > 30 AND Name LIKE '%something%'

您的第二个查询会产生类似

的内容
SELECT q1.* 
FROM Sometable q1 
    JOIN Sometable q2 ON q1.Id = q2.Id
WHERE q1.Id > 30 AND q2.Name LIKE '%something%')

几乎每次,从单个中选择将比两个表之间的连接更快地返回结果。

如果LINQ语句未能添加表,请确保包含它们。

var queryable = db.Sometable.Include(i => i.ForeignTable).Where(x=> x.Id > 30);

答案 2 :(得分:0)

我会去找where子句,避免自己加入同一个表并使代码更清晰

您可以在dbcontext中添加日志以查看生成的sql查询

db.context.Database.Log = System.Diagnostic.Debug.WriteLine;

无论如何要改善查询的性能我会:

  1. 仅选择您实际需要的字段(不是*)

  2. 检查表的索引

  3. 你真的需要包含声明吗?如果记录增长很多,那么sql会出现性能问题,例如'%XXX%'"