2012-05-09 13 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, "(", "+", ")")); 
     } 
    } 
}