【发布时间】:2011-06-07 15:46:07
【问题描述】:
我正在使用 NHibernate 3.1.0,我正在尝试通过使用 BaseHqlGeneratorForMethod 和扩展 DefaultLinqToHqlGeneratorsRegistry 来扩展 LINQ 提供程序,如 Fabio's post 中所述。
例如,为了支持ToString(),我创建了一个ToStringGenerator,如下所示。
internal class ToStringGenerator : BaseHqlGeneratorForMethod
{
public ToStringGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<object>(x => x.ToString())
};
}
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Cast(visitor.Visit(targetObject).AsExpression(), typeof(string));
}
}
我已经注册了
internal class CustomLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public CustomLinqToHqlGeneratorsRegistry()
{
this.Merge(new ToStringGenerator());
}
}
等等。到目前为止,这适用于“静态”查询,我可以像这样使用它:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where(p => p.Id.ToString().Contains(pId));
这会正确转换为对应的 SQL(使用 SQL Server 2008)
where cast(project0_.Id as NVARCHAR(255)) like (''%''+@p0+''%'')
当我尝试将它与 Microsoft Dynamic LINQ 库(在 this Scott Guthrie's post 中讨论)结合使用时会出现问题,如下所示:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where("Id.ToString().Contains(@0)", pId);
这会导致 NotSupportedException 消息为“System.String ToString()”(这与我在实施之前使用静态查询得到的消息完全相同上面提到的类)。此异常的来源为“NHibernate”,StackTrace 位于“at NHibernate.Linq.Visitor.HqlGeneratorExpressionTreeVisitor.VisitMethodCallExpression(MethodCallExpression expression)”。 p>
那么我在这里错过了什么?我做错了什么,或者需要做什么来支持这种情况?
【问题讨论】:
标签: c# .net linq nhibernate linq-to-nhibernate