NHibernate LINQ Contains不起作用

时间:2011-06-27 10:52:23

标签: linq nhibernate fluent-nhibernate

我是NHibernate的新手,并与FluentNhibernate合作开发一个新项目。在执行一个非常简单的linq查询时,我遇到了一个奇怪的问题。

查询1 - 效果很好

      //Query 1
          var customers = from customer in _session.Query<Customer>() 
                        where customer.FirstName == "john"
                        select new
                        {
                            customer.FirstName,
                            customer.LastName
                        };

当执行以下查询2时,我收到错误“无法执行查询”

       //Query 2.
           var customers = from customer in _session.Query<Customer>() 
                         where customer.FirstName.Contains("john")
                        select new
                        {
                            customer.FirstName,
                            customer.LastName
                        };

NH生成的查询是,

选择customer0_.FirstName为col_0_0_,customer0_.LastName为col_1_0_ 来自tblCustomer customer0_ customer0_.FirstName喜欢('%'|| @ p0 ||'%'); @ p0 ='john'

它生成 FirstName喜欢('%'|| @ p0 ||'%')而不是 FirstName喜欢('%'+ @ p0 +'%')我能理解。

我使用的数据库是SQLServerCE,NHibernate版本是3.1.0

请帮助解决此问题。

1 个答案:

答案 0 :(得分:4)

这是“Dialect.cs”文件中的concat函数的定义(NH的基本方言类):

RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "||", ")"));

哪个应该是

RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));

用于SQL CE。 所以你必须使用MsSqlCe40Dialect类。 我认为它还没有在流畅的NHibernate中注册,所以你可以这样定义:

... MsSqlCeConfiguration.Standard  
                      ...  
                      .Dialect<MsSqlCe40Dialect>();  

还有其他缺失功能的补丁,等待批准: https://nhibernate.jira.com/browse/NH-2723 请投票!

在此期间,您可以创建自己的方言:

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

namespace Test1
{
    public class TempSqlCeDialect : MsSqlCeDialect
    {
        public TempSqlCeDialect()
        {
            RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
        }
    }
}

然后你可以通过定义:

来使用它
... MsSqlCeConfiguration.Standard.Dialect<TempSqlCeDialect>() ...