代码之家  ›  专栏  ›  技术社区  ›  e36M3

实体框架。其中方法链接

  •  28
  • e36M3  · 技术社区  · 14 年前

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

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

    似乎链子完全可以完成和条件。我不相信你能用链子或语句。有没有理由偏爱一个而不是另一个,或者一个更好/更有效的场景?

    3 回复  |  直到 14 年前
        1
  •  44
  •   Justin Niessner    14 年前

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


    更新

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

    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);
    
        2
  •  2
  •   dotariel    14 年前

    我猜只要你和 IQueryable 可液化的 允许延迟执行,因此本质上相同的SQL是在后台生成的。

        3
  •  0
  •   skaz    14 年前