Are*_*ren 7 .net c# nhibernate linq-to-nhibernate
我有这个实体,上面有一个<dynamic-component>
条目和许多属性.它被作为一个实体类消费
IDictionary
.
映射工作正常,一切都很糟糕,直到我根据这个字典中的值进行查询.
首先,我尝试了以下linq查询:
repository.Where(x => x.Specifications[key] == value)
Run Code Online (Sandbox Code Playgroud)
要查询它.(规格是动态组件)查询导致以下错误:
未处理的异常:System.InvalidCastException:无法将类型为'NHibernate.Type.ComponentType'的对象强制转换为'NHibernate.Type.CollectionType'.
确定这可能超出了Linq Provider的界限,然后我继续构建一个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();
Run Code Online (Sandbox Code Playgroud)
这对于生成正确的SQL非常有用,除了表达式被缓存,因此后续调用此函数会将所有值与第一个键进行比较.
从这里我找到了treeBuilder.DictionaryItem(...)
AST节点并构建了以下内容:
var specificationExpression =
treeBuilder.Dot(
visitor.Visit(arguments[0]).AsExpression(),
treeBuilder.Ident("Specifications")).AsExpression();
var specification =
treeBuilder.DictionaryItem(specificationExpression, key).AsExpression();
Run Code Online (Sandbox Code Playgroud)
我再次遇到以下错误:
未处理的异常: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>
Run Code Online (Sandbox Code Playgroud)
实体:
/// <summary>
/// Specifications
/// </summary>
public virtual IDictionary Specifications { get; set; }
Run Code Online (Sandbox Code Playgroud)
由于 NHibernate linq 提供程序中的错误,从 3.1.0 开始,您将无法使用它来查询动态组件
https://nhibernate.jira.com/browse/NH-2664
希望3.2版本能够修复
同时,您应该使用 Criteria 或 HQL 查询。
归档时间: |
|
查看次数: |
1257 次 |
最近记录: |