我正在使用NHibernate 3.1.0,我试图通过使用BaseHqlGeneratorForMethod和扩展,DefaultLinqToHqlGeneratorsRegistry如Fabio的帖子中所解释的那样扩展LINQ提供程序.
例如,为了支持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));
}
}
Run Code Online (Sandbox Code Playgroud)
我已经注册使用
internal class CustomLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public CustomLinqToHqlGeneratorsRegistry()
{
this.Merge(new ToStringGenerator());
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止这适用于"静态"查询,我可以像这样使用它:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where(p => p.Id.ToString().Contains(pId));
Run Code Online (Sandbox Code Playgroud)
这正确转换为SQL对应(使用SQL Server …