NHibernate 3,动态组件,字典和LINQ查询
本文关键字:LINQ 字典 查询 组件 动态 NHibernate | 更新日期: 2023-09-27 17:50:24
我有一个<dynamic-component>
条目和一些属性。它在实体类上作为IDictionary
。
映射工作得很好,一切都很好,直到我根据这个字典中的值进行查询。
首先,我尝试了以下linq查询:
repository.Where(x => x.Specifications[key] == value)
查询。(规格是动态组成部分)查询导致以下错误:
Unhandled Exception: System。InvalidCastException:无法转换类型为"NHibernate.Type"的对象。ComponentType'到类型"NHibernate.Type.CollectionType"。
认为这可能超出了Linq提供程序的范围继续构建一个BaseHqlGeneratorForMethod
来处理自定义linq
它是用treeBuilder.Dot(...)
AST构建的,如下所示:
var specificationExpression =
treeBuilder.Dot(
visitor.Visit(arguments[0]).AsExpression(),
treeBuilder.Ident("Specifications")).AsExpression();
var targetExpression =
treeBuilder.Dot(
visitor.Visit(arguments[0]).AsExpression(),
treeBuilder.Ident(keyExpression.Value.ToString())).AsExpression();
这对于生成正确的SQL非常有效,除了表达式被缓存,因此对该函数的后续调用将将所有值与第一个键进行比较。
从这里我找到了treeBuilder.DictionaryItem(...)
AST节点和构建了如下代码:
var specificationExpression =
treeBuilder.Dot(
visitor.Visit(arguments[0]).AsExpression(),
treeBuilder.Ident("Specifications")).AsExpression();
var specification =
treeBuilder.DictionaryItem(specificationExpression, key).AsExpression();
再次出现以下错误:
Unhandled Exception: System。InvalidCastException:无法转换类型为"NHibernate.Type"的对象。ComponentType'到类型"NHibernate.Type.CollectionType"。
我在这里做错了什么?可以不查询<dynamic-component>
吗?我执行得不正确吗?这是我应该报告的错误吗?
映射:
<dynamic-component name="Specifications">
<property name="sp_Graphics" column="sp_Graphics" />
<property name="sp_Weight" column="sp_Weight" />
</dynamic-component>
实体:/// <summary>
/// Specifications
/// </summary>
public virtual IDictionary Specifications { get; set; }
由于NHibernate linq提供程序中的一个bug,从3.1.0开始,你将无法使用它来查询动态组件
https://nhibernate.jira.com/browse/nh - 2664希望能在3.2版中修复
同时你应该使用Criteria或者HQL查询
NHibernate 3.3.1(有效链接:https://nhibernate.jira.com/browse/NH-2664)