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 3,动态组件,字典和LINQ查询

由于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)