C# 实体框架。其中方法链接

C# 实体框架。其中方法链接,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,这两种查询上下文的方法有什么区别吗 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 ==

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

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();

看来,链接是完美的完成和条件。我不相信你能说出一系列的话。是否有理由选择一种方法而不是另一种方法,或者选择一种方法更好/更有效的方案?

您可以通过代码进行调试,并查看每种方法生成的SQL。我可以想象它会变成同一个查询。

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


更新

我刚刚用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);


您还可以将内容压缩一点(出于与上述相同的原因,我认为更可取):


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

第一个SQL对我来说是最可读的。您可以立即看到有两个独立的条件必须匹配,并且它们完美地排列在一起。当然,第二个也有两个条件,但需要额外的一秒钟才能解析出LINQPad的行中有一个&&.+1。LINQPad:。对于LINQ来说,这是一个很棒的小工具。我对您的最后一个语法(FirstOrDefault(谓词…)有一个问题,鉴于ObjectQuery同时实现IEnumerable和IQueryable,那么选择IQueryable.FirstOrDefault()而不是IEnumerable.FirstOrDefault()的编译器重载解析算法是什么这样您就可以看到谓词显示在Profiler或LINQPad上生成的SQL中了?更多信息,请看我对这个问题的回答:谢谢。(意识到这个问答现在比一些二年级学生更老了…)奇怪的是,在EF Core中,我有一个查询,如果我
&&
在一个
Where()
,但如果我把每个子句放在它自己的
中,其中(l=>…)
,我就是黄金/临盆前的按摩和耸耸肩^我讨厌上一个显示这种糟糕格式的“紧凑”示例
var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId 
                                                  && f.AnotherId == anotherId);