Nhibernate,其中子字符串错误

Nhibernate,其中子字符串错误,nhibernate,substring,queryover,Nhibernate,Substring,Queryover,我有一个这样的工作查询: SELECT this_.ID, this_.NomeFile, this_.DataGenerazioneFile, esitiopera_.ID, esitiopera_.Date, esitiopera_.ID_FileTelematico FROM FileTelematico this_ LEFT OUTER JOIN EsitoOperazione esitiopera_ ON this_.ID = esitiopera_.ID_FileTelematic

我有一个这样的工作查询:

SELECT this_.ID, this_.NomeFile, this_.DataGenerazioneFile, esitiopera_.ID, esitiopera_.Date, esitiopera_.ID_FileTelematico
FROM FileTelematico this_ 
LEFT OUTER JOIN EsitoOperazione esitiopera_ ON this_.ID = esitiopera_.ID_FileTelematico 
WHERE SUBSTRING (this_.NomeFile, 1, LEN(this_.NomeFile)-4)
IN ('filename1', 'filename2', 'filename3')   
ORDER BY this_.DataGenerazioneFile DESC;
我正试图用QueryOver写同样的东西

FileTelematico ft = null;
string[] nomi = {'filename1', 'filename2', 'filename3'}
var files = session.QueryOver<FileTelematico>(() => ft)                     
            .Where(() => ft.NomeFile.Substr(1, ft.NomeFile.StrLength() -4)
            .IsIn(nomi))
            .Fetch(x => x.EsitiOperazioni).Eager
            .OrderBy(() => ft.DataGenerazioneFile).Desc
            .List()
FileTelematico ft=null;
字符串[]nomi={'filename1','filename2','filename3'}
var files=session.QueryOver(()=>ft)
.Where(()=>ft.NomeFile.Substr(1,ft.NomeFile.StrLength()-4)
.IsIn(nomi))
.Fetch(x=>x.EsitiOperazioni)。渴望
.OrderBy(()=>ft.DataGenerazioneFile).Desc
.List()
但它只是以System.NullReferenceException结束

    in System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   in System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   in System.Delegate.DynamicInvokeImpl(Object[] args)
   in System.Delegate.DynamicInvoke(Object[] args)
   in NHibernate.Impl.ExpressionProcessor.FindValue(Expression expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 248
   in NHibernate.Impl.ExpressionProcessor.FindMemberProjection(Expression expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 258
   in NHibernate.Criterion.RestrictionExtensions.ProcessIsInCollection(MethodCallExpression methodCallExpression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Criterion\RestrictionsExtensions.cs:riga 138
   in NHibernate.Impl.ExpressionProcessor.ProcessCustomMethodCall(MethodCallExpression methodCallExpression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 662
   in NHibernate.Impl.ExpressionProcessor.ProcessBooleanExpression(Expression expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 620
   in NHibernate.Impl.ExpressionProcessor.ProcessExpression(Expression expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 671
   in NHibernate.Impl.ExpressionProcessor.ProcessLambdaExpression(LambdaExpression expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 676
   in NHibernate.Impl.ExpressionProcessor.ProcessExpression(Expression`1 expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 697
   in NHibernate.Criterion.QueryOver`2.Add(Expression`1 expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Criterion\QueryOver.cs:riga 755
   in NHibernate.Criterion.QueryOver`2.Where(Expression`1 expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Criterion\QueryOver.cs:riga 362
   in NHibernate.Criterion.QueryOver`2.NHibernate.IQueryOver<TRoot,TSubType>.Where(Expression`1 expression) in d:\Projects\NHibernate\nhibernate-core\src\NHibernate\Criterion\QueryOver.cs:riga 803
   in 
System.RuntimeMethodHandle.InvokeMethod(对象目标、对象[]参数、签名符号、布尔构造函数)中的

在System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal中(对象obj、对象[]参数、对象[]参数)
在System.Delegate.DynamicInvokeImpl(对象[]args)中
在System.Delegate.DynamicInvoke中(对象[]args)
在d:\Projects\NHibernate\NHibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs中的NHibernate.Impl.ExpressionProcessor.FindValue(表达式表达式)中
在d:\Projects\NHibernate\NHibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs中的NHibernate.Impl.ExpressionProcessor.FindMemberProjection(表达式表达式)中
在d:\Projects\NHibernate\NHibernate core\src\NHibernate\criteria\RestrictionExtensions.cs中的NHibernate.criteria.RestrictionExtensions.ProcessIsInCollection(MethodCallExpression MethodCallExpression)中
在d:\Projects\NHibernate\NHibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 662中的NHibernate.Impl.ExpressionProcessor.ProcessCustomMethodCall(MethodCallExpression-MethodCallExpression)中
在d:\Projects\NHibernate\NHibernate core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 620中的NHibernate.Impl.ExpressionProcessor.ProcessBooleanExpression(表达式表达式表达式)中
在d:\Projects\NHibernate\NHibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 671中的NHibernate.Impl.ExpressionProcessor.ProcessExpression(表达式表达式)中
在d:\Projects\NHibernate\NHibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 676中的NHibernate.Impl.ExpressionProcessor.ProcessLambdaExpression(LambdaExpression表达式)中
在d:\Projects\NHibernate\NHibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:riga 697中的NHibernate.Impl.ExpressionProcessor.ProcessExpression(表达式`1 Expression)中
在NHibernate.criteria.QueryOver`2.中,在d:\Projects\NHibernate\NHibernate-core\src\NHibernate\criteria\QueryOver.cs:riga 755中添加(表达式`1表达式)
在NHibernate.criteria.QueryOver`2.Where(表达式`1表达式)中的d:\Projects\NHibernate\NHibernate core\src\NHibernate\criteria\QueryOver.cs:riga 362
在d:\Projects\NHibernate\NHibernate core\src\NHibernate\criteria\QueryOver.cs:riga 803中的NHibernate.criteria.QueryOver`2.NHibernate.IQueryOver.Where(表达式`1 Expression)中
在里面
如果不使用Substr,但需要使用它(或Substring),则不会发生这种情况


另外,我正在使用Nhibernate 4.0.3 GA

不幸的是,
.SubStr
扩展方法的功能不足以处理常量以外的任何参数

幸运的是,您可以通过使用
Projections.SqlFunction
并以这种方式调用
substring
方法来解决这个问题。您还需要添加一个可以执行减法的函数,因为不幸的是,您无法使用内置的查询功能执行算术运算

首先,创建一个包含自定义投影的静态类:

public static class CustomProjections
{
    public static IProjection Subtract(IProjection one, IProjection other)
    {
        return Projections.SqlFunction(
            new VarArgsSQLFunction(NHibernateUtil.Int32, "(", "-", ")"),
            NHibernateUtil.Int32,
            one,
            other);
    }

    public static IProjection SubStr(IProjection prop, IProjection start, IProjection end)
    {
        return Projections.SqlFunction(
            "substring",
            NHibernateUtil.String,
            prop,
            start,
            end);
    }

    public static IProjection Length(IProjection prop)
    {
        return Projections.SqlFunction(
            "length",
            NHibernateUtil.Int32,
            prop);
    }
}
接下来,使用
限制。在
中,使用自定义投影,将
长度
投影的结果传递给
SubStr

FileTelematico ft = null;

session.QueryOver<FileTelematico>(() => ft)
    .Where(
        Restrictions.In(
            CustomProjections.SubStr(
                Projections.Property(() => ft.NomeFile),
                Projections.Constant(1),
                CustomProjections.Subtract(
                    CustomProjections.Length(
                        Projections.Property(() => ft.NomeFile)),
                        Projections.Constant(4))),
            nomi))
    .Fetch(x => x.EsitiOperazioni).Eager
    .OrderBy(() => ft.DataGenerazioneFile).Desc
    .List();

非常感谢,它编写了正确的SQL,但是如果我不能使用这个:
LEN(this.NomeFile)-4
,而且似乎这是不可能的,这样的查询是没有用的。@Shyguy:很抱歉,我完全错过了
-4
部分。我会修正这个问题并更新答案。非常感谢,这将生成正确的SQL,我还学习了一种新的解决方法,以备将来需要。
FileTelematico ft = null;

IProjection length = 
    CustomProjections.Subtract(
        CustomProjections.Length(Projections.Property(() => ft.NomeFile)),
        Projections.Constant(4));

IProjection substring =
    CustomProjections.SubStr(
        Projections.Property(() => ft.NomeFile),
        Projections.Constant(1),
        length);

AbstractCriterion inRestriction =
    Restrictions.In(substring, nomi);


session.QueryOver<FileTelematico>(() => ft)
    .Where(inRestriction)
    .Fetch(x => x.EsitiOperazioni).Eager
    .OrderBy(() => ft.DataGenerazioneFile).Desc
    .List();