这两种查询上下文的方式有什么区别吗?
Firm firm = base.context.Firms
.Where(f => f.SomeId == someId)
.Where(f => f.AnotherId == anotherId)
.FirstOrDefault();
Firm firm = base.context.Firms
.Where(f => f.SomeId == someId && f.AnotherId == anotherId)
.FirstOrDefault();
看起来链接完全可以完成AND条件。我不相信你可以链接OR语句。是否有理由选择一个优于另一个,或者一个更好/更有效的情况?
答案 0 :(得分:40)
他们应该产生相同的最终结果(如果我没有记错的话),但我发现第二个更可读,更好地显示原始意图。
<强>更新强>
我刚使用LINQPad验证了上述语句。事实上,这两个查询都会生成相同的SQL。
例如:
context.SomeTable.Where(c => c.ParentId == null)
.Where(c => c.Name.Contains("F"))
.Select(c => c.Name);
产地:
SELECT [t0].[Name]
FROM [SomeTable] AS [t0]
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL)
与以下产生的SQL相同:
context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F"))
.Select(c => c.Name);
你也可以再压缩一些东西(我认为这与上面相同的原因更合适):</ p>
var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId
&& f.AnotherId == anotherId);
答案 1 :(得分:2)
我的猜测是,只要你在IQueryable
中工作(因为你的上下文集合可能是),使用链式扩展与完整谓词子句就可以达到同样的效果。这是因为IQueryable
允许延迟执行,因此在幕后生成相同的SQL。
答案 2 :(得分:0)
您可以通过代码进行调试,并查看由于每个代码而生成的SQL。我想它会变成相同的查询。