NHibernate/Linq使用SQL CE创建无效SQL

NHibernate/Linq使用SQL CE创建无效SQL,nhibernate,sql-server-ce,linq-to-nhibernate,Nhibernate,Sql Server Ce,Linq To Nhibernate,我正在使用NHibernate3.1和SQLCE4(使用MSSQLSCE40方言)。使用Linq生成查询 如果我使用String.Contains、String.StartsWith或String.EndsWith,将生成无效的SQL 例如: Session.Query<User>.Where(user => user.Name.Contains("Joe")) 这与实际生成的SQL相比有些简化,但问题在于额外的'| | |…| |' 我认为这是SQLCE方言的一个问题,但我

我正在使用NHibernate3.1和SQLCE4(使用MSSQLSCE40方言)。使用Linq生成查询

如果我使用String.Contains、String.StartsWith或String.EndsWith,将生成无效的SQL

例如:

Session.Query<User>.Where(user => user.Name.Contains("Joe"))
这与实际生成的SQL相比有些简化,但问题在于额外的
'| | |…| |'


我认为这是SQLCE方言的一个问题,但我不确定接下来该怎么办。有什么解决方案吗?

看起来这是在3.1版发布后不久修复的()。不幸的是,由于其他依赖关系,我无法升级NHibernate。同时,我通过使用以下代码对
mssqlce40dialent
进行子类化,解决了这个问题:

using NHibernate;
using NHibernate.Dialect;
using NHibernate.Dialect.Function;

namespace DataAccess
{
    public class CustomMsSqlCe40Dialect : MsSqlCe40Dialect
    {
        public CustomMsSqlCe40Dialect ()
        {
            RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
        }
    }
}

看起来这是在3.1发行版()后不久修复的。不幸的是,由于其他依赖关系,我无法升级NHibernate。同时,我通过使用以下代码对
mssqlce40dialent
进行子类化,解决了这个问题:

using NHibernate;
using NHibernate.Dialect;
using NHibernate.Dialect.Function;

namespace DataAccess
{
    public class CustomMsSqlCe40Dialect : MsSqlCe40Dialect
    {
        public CustomMsSqlCe40Dialect ()
        {
            RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
        }
    }
}

你能在这个特殊的情况下使用HQL吗?这实际上是一个更大的查询的一部分。如果可能的话,我想把它保持在林克状态。您知道有什么方法可以将Linq与HQL或条件结合起来吗?使用HQL编写整个过程?您可以将HQL用于此特定情况吗?这实际上是更大查询的一部分。如果可能的话,我想把它保持在林克状态。您知道有什么方法可以将Linq与HQL或标准结合起来吗?使用HQL编写整个过程?