Я использую NHibernate 3.1.0 и пытаюсь расширить поставщика LINQ, используя BaseHqlGeneratorForMethod
и расширяя DefaultLinqToHqlGeneratorsRegistry
, как объяснено в пост Фабио .
Например, для поддержки 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 (обсуждается в этой статье Скотта Гатри ), например:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where("Id.ToString().Contains(@0)", pId);
Это приводит к NotSupportedException с сообщением " System.String ToString () " (которое было точно такими же сообщениями, которые я получал со статическими запросами до реализации классов упомянутое выше). Это исключение вызывается с источником « NHibernate » и с StackTrace в « в NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitMethodCallExpression (выражение MethodCallExpression) ».
".
Так чего мне здесь не хватает? Что я сделал не так или что нужно сделать, чтобы поддержать этот сценарий?