【发布时间】:2015-07-02 15:40:23
【问题描述】:
使用Linq-to-SQL,不知下面三个哪个更惯用,
foos.Where(foo => foo.Bar.HasValue && foo.Bar.Value < 42)foos.Where(foo => foo.Bar.Value < 42)foos.Where(foo => foo.Bar < 42)
第一个选项生成一个额外的Bar IS NOT NULL 谓词,该谓词可能在大多数 DBMS 中已被优化掉。如果查询的是对象而不是数据库,则 null-check 将是强制性的,但由于可以创建通用的 IQueriable<Foo> 查询,这些查询可能在对象上失败但在数据库上失败,第一个选项将始终有效,尽管 Linq 和 SQL代码比第二个选项长一点。 Michael Liu 提供的第三个选项似乎是两全其美,但在 foo.Bar 的类型为 bool? 的情况下不起作用:foos.Where(foo => foo.Bar)(导致类型错误因为这里没有进行隐式转换)。
是否应该努力编写在最初设计的上下文之外使用时不会失败的通用查询?
【问题讨论】:
标签: c# sql linq linq-to-sql