2012-05-09 27 views
1

我使用NHibernate 3.1与SQL CE 4(使用MsSqlCe40Dialect)。使用Linq来产生查询。NHibernate/Linq使用SQL CE创建无效SQL

如果我使用String.Contains,String.StartsWith或String.EndsWith,则会生成无效的SQL。

例如:

Session.Query<User>.Where(user => user.Name.Contains("Joe")) 

产生这样的SQL:

SELECT Name FROM User WHERE (User.Name like ('%'||@p0||'%')) 

这在一定程度上从生产实际的SQL简化,但问题是在额外'||...||'

我期待这是SQL CE方言的一个问题,但我不确定该从哪里去。修复/解决方法的任何想法?

+0

您可以在此特定情况下使用HQL吗? –

+0

这实际上是一个更大的查询的一部分。如果可能的话,我想保留Linq。你知道有什么方法将Linq与HQL或标准结合起来吗? – andypaxo

+0

使用HQL编写整个事物? – Baz1nga

回答

1

看起来这是在3.1版本(in this commit)之后不久修复的。不幸的是,由于其他依赖关系,我无法升级NHibernate。与此同时,我已经通过将MsSqlCe40Dialect分类为以下代码来解决此问题:

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

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