entity framework。所有方法链接

这两种查询上下文的方式有什么区别吗?

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语句。 是否有理由更喜欢一个,或者一个更好/更有效的情况?

他们应该产生相同的最终结果(如果我没有弄错),但我发现第二个更可读,更好地显示原始意图。


更新

我刚刚使用LINQPadvalidation了上述语句。 事实上,这两个查询都会生成相同的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); 


你也可以再压缩一些东西(我认为这与上面相同的原因更合适):

 var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId && f.AnotherId == anotherId); 

我的猜测是,只要您在IQueryable中工作(可能是您的上下文集合),使用链式扩展与完整谓词子句就可以实现相同的目的。 这是因为IQueryable允许延迟执行,因此在幕后生成相同的SQL。

您可以通过代码进行调试,并查看由于每个代码而生成的SQL。 我想它会变成相同的查询。