我有一个过滤器,根据用户选择我有条件地添加更多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
答案 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;
无论如何要改善查询的性能我会:
仅选择您实际需要的字段(不是*)
检查表的索引