实体框架。所有方法链接

时间:2010-11-04 15:35:47

标签: 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 == someId && f.AnotherId == anotherId)
            .FirstOrDefault();

看起来链接完全可以完成AND条件。我不相信你可以链接OR语句。是否有理由选择一个优于另一个,或者一个更好/更有效的情况?

3 个答案:

答案 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。我想它会变成相同的查询。