【问题标题】:NHibernate LINQ Contains doesn't workNHibernate LINQ 包含不起作用
【发布时间】:2011-06-27 10:52:22
【问题描述】:

我是 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 like ('%'||@p0||'%');@p0 = 'john'

它生成了 FirstName like ('%'||@p0||'%') 而不是 FirstName like ('%'+@p0+'%') 据我所知。

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

请帮助解决这个问题。

【问题讨论】:

  • 您使用的是哪个版本的 NHibernate?
  • || 不可能是您正在使用的 SQL 方言中字符串连接的一个选项吗?你用的是什么数据库?查询真的失败了吗?
  • 我正在使用 NHibernate v 3.1.0
  • 我使用的是SQL Server内嵌版,查询失败。

标签: linq nhibernate fluent-nhibernate


【解决方案1】:

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

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

应该是这样的

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

用于 SQL CE。 所以你必须使用 MsSqlCe40Dialect 类。 我认为它还没有在fluent-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>() ...

【讨论】:

  • 将方言更改为 MsSqlCe40Dialect 但仍然无法正常工作。我必须等到那个错误被修复还是?
  • 我已经编辑了我的上一篇文章以添加“TempSqlCeDialect”。它应该可以解决问题。
猜你喜欢
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 2011-02-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
相关资源
最近更新 更多