1

想做一些重构......使用 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();
  }

任何一个都比另一个更好吗?任何提示、链接或代码都会受到赞赏。干杯!

4

3 回答 3

3

将谓词分成两块似乎让我感到困惑。我会将“过滤”代码保留在一个地方,然后将其全部放入.Where(您的第二个示例)或全部放入.FirstOrDefault. 后一种选择更简洁,使用的运算符更少,因此通常是理想的。

于 2012-06-12T15:04:53.890 回答
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。

于 2012-06-12T15:12:34.340 回答
0

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

于 2012-06-12T15:07:22.047 回答