![]() |
1
10
正如这里已经提到的,LINQ允许通过简单地添加更多的条件来扩展任何查询。
另一方面,许多ORM工具支持编译查询:
但是如果我们在这里尝试使用这种方法,我们会立即注意到我们的查询实际上是动态的:
那么,我们是否可以在没有显式缓存的情况下执行编译后的查询呢? 数据对象.Net4支持所谓的“布尔分支”特性。它意味着在查询编译期间对任何常量布尔表达式求值,并将其实际值作为真布尔常量(即不是作为参数值或作为使用参数的表达式)注入SQL查询。 这个特性允许根据这些布尔表达式的值轻松地生成不同的查询计划。E、 g.本规范:
将使用两个不同的SQL查询执行,因此-两个不同的查询计划:
=all Case,当为null时:
当all==null时,查询计划:
第二种情况(当所有!=null),SQL查询:
第二种情况(当所有!=null),查询计划:
请注意,几乎任何其他ORM都会使用整型参数将其编译为查询:
由于SQL Server(以及大多数数据库)为特定查询生成单一版本的查询计划,因此在这种情况下,它只有一个选项—生成带有索引扫描的计划:
布尔分支允许以非常简单的方式实现它:
这个例子和你的不同,但它说明了这个想法。我使用不同的模型主要是为了能够测试这一点(我的例子是基于om Northwind模型)。 此查询是:
|
![]() |
2
9
这可以使用linq到sql来完成。。。
|
![]() |
3
6
NHibernate使用标准API支持这一点:
|
![]() |
4
2
你可能可以用任何一个LINQ提供者来做这个,但是我知道 LightSpeed ORM支持:
|
![]() |
5
0
我一直在尼伯内特做这种事。 (我在Rails中也做过类似的事情。我有点惊讶有这么多人 不要 支持这一点。) |
![]() |
6
0
您可以使用NHibernate的HQL(Hibernate查询语言)以这种方式轻松地构建查询。这将是一个几乎相同的实现,但我个人会使用参数。
|
![]() |
7
0
不爱伊布尔根?它也能做到。 使用“适配器”样式:
我想大多数ORMs应该可以很容易地做到这一点。 |
![]() |
8
0
您可以使用谓词生成器和LINQ to NHibernate生成动态查询,如下所示:
您可以利用类型保存查询和编译器检查的优势。
编辑:添加示例。 它可能是这样的:获取与世界上N个区域匹配的所有位置,用户在其中选择要查看的区域,我们不知道用户将选择多少个区域,我们必须动态构建(或)表达式,您可以执行以下操作:
您可以为以下复杂场景嵌套谓词: 如果你想做这样的事
您可以构建:
谓词生成器源代码和示例位于 http://www.albahari.com/nutshell/predicatebuilder.aspx |
![]() |
A B · C#Excel自动调整列避免长文本时出错 7 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 8 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 8 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 8 月前 |