У меня была похожая проблема с использованием LINQ, и я исправил ее с помощью ответа, опубликованного Викрамом Найяком на заданный здесь вопрос: Nhibernate LINQ DateTime.AddDay не работает .
Вот как я это сделал:
В примере Викрама я заменил следующие классы:
public class ExtendedLinqtoHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public ExtendedLinqtoHqlGeneratorsRegistry()
{
this.Merge(new DateTimeToShortDateStringGenerator());
//I had to use the lines below instead.
//MethodInfo method = ReflectionHelper.GetMethodDefinition<DateTime>(x => x.ToShortDateString());
//RegisterGenerator(method, new DateTimeToShortDateStringGenerator());
}
}
public class DateTimeToShortDateStringGenerator : BaseHqlGeneratorForMethod
{
public DateTimeToShortDateStringGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<DateTime>(x => x.ToShortDateString())
};
}
public override HqlTreeNode BuildHql(MethodInfo method, System.Linq.Expressions.Expression targetObject, ReadOnlyCollection<System.Linq.Expressions.Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.MethodCall("DateTimeToShortDateString", visitor.Visit(targetObject).AsExpression());
}
}
public class CustomDialect : MsSql2008Dialect
{
public CustomDialect()
{
RegisterFunction(
"DateTimeToShortDateString",
new SQLFunctionTemplate(
NHibernateUtil.DateTime,
"CONVERT(NVARCHAR(10), ?1, 105)"
)
);
}
}
Затем вы можете использовать следующий синтаксис:
using (session.BeginTransaction())
{
var patients = session.Query().Where(p => p.BirthDate.ToShortDateString().Contains("1975"));
}