NHibernate LINQ Contains не работает - PullRequest
3 голосов
/ 27 июня 2011

Я новичок в 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 как ('%' || @ p0 || '%') вместо FirstName как ('%' + @ p0 + '%') как Я могу понять.

База данных, которую я использую, - SQLServerCE, а версия NHibernate - 3.1.0

.

Пожалуйста, помогите решить эту проблему.

1 Ответ

4 голосов
/ 27 июня 2011

Это определение функции concat в файле "Dialect.cs" (базовый класс диалекта NH):

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>() ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...