哪个更好的linq查询? .Where(暴击).FirstOrDefault()或.Where(someCrit).FirstOrDefault(someOtherCrit)?

时间:2012-06-12 14:58:38

标签: c# sql linq nhibernate

希望进行一些重构...使用NHibernate我目前有这个查询

 public Widget FindByCode(string code)
 {
  return 
             _session
                 .Query<Widget>()
                 .Where(w => !w.IsDeleted)
                 .FirstOrDefault(w => w.Code == code);
  }

我在考虑使用这个

public Widget FindByCode(string code)
 {
  return 
             _session
                 .Query<Widget>()
                 .Where(w => !w.IsDeleted && w.Code == code)
                 .FirstOrDefault();
  }

其中一个比另一个好吗?任何提示,链接或代码总是受到赞赏。 干杯!

3 个答案:

答案 0 :(得分:3)

将谓词分成两个块似乎让我感到困惑。我会将“过滤”代码保存在一个位置,并将其全部放在.Where(您的第二个示例)中或全部放在.FirstOrDefault中。后一种选择更简洁,使用的操作员更少,因此通常是理想的选择。

答案 1 :(得分:3)

在linq2objects或linq2sql中你可以像这样写一个FirstOrDefault:

public Widget FindByCode(string code)
 {
  return 
             _session
                 .Query<Widget>()
                 .FirstOrDefault(w => !w.IsDeleted && w.Code == code);
  }

不确定NHibernate,但可能有效。并且您始终可以使用NHProf或常规sql profiler检查生成的sql。

答案 2 :(得分:0)

第二个更好,因为它只会根据两个标准进行一次投影。第一个将根据第一个标准进行第一次投影,然后根据第二个标准应用第二个投影。 我建议使用第二种方法。