Странная проблема с LINQ to NHibernate и сравнением строк - PullRequest
1 голос
/ 21 февраля 2010

Я использую LINQ для NHibernate и столкнулся со странной проблемой при сравнении строк. Следующий код работает нормально, но когда я комментирую: //MyCompareFunc(dl.DamageNumber ,mageNumberSearch) && и комментарий: dl.DamageNumber.Contains (mageNumberSearch) && затем он ломается и кажется, что MyCompareFunc () всегда возвращает true, тогда как dl.DamageNumber.Contains (mageNumberSearch) иногда возвращает true, а иногда возвращает false.

Другими словами, когда я использую string.Contains () в запросе LINQ напрямую, он работает, но когда я перемещаю его в метод, он не работает.

    internal List<DamageList> SearchDamageList(
    DateTime? sendDateFromSearch, DateTime? sendDateToSearch, string damageNumberSearch,
    string insuranceContractSearch)
    {
        var q = from dl in session.Linq<DamageList>()
                where
                CommonHelper.IsDateBetween(dl.SendDate, sendDateFromSearch, sendDateToSearch) &&
                //MyCompareFunc(dl.DamageNumber, damageNumberSearch) &&
                dl.DamageNumber.Contains(damageNumberSearch) &&
                insuranceContractSearch == null ? true : CommonHelper.IsSame(dl.InsuranceContract, insuranceContractSearch)
                select dl;

        return q.ToList<DamageList>();
    }

    private bool MyCompareFunc(string damageNumber, string damageNumberSearch)
    {
        return damageNumber.Contains(damageNumberSearch);
    }

Ответы [ 2 ]

2 голосов
/ 21 февраля 2010

Я должен признать, что я не эксперт в NHibernate, но при использовании другого ORM мы часто сталкиваемся с такой же проблемой. Дело в том, что движок LINQ при переводе запроса способен распознавать простые строковые функции из библиотеки .NET, такие как Contains, и переводить их в эквивалент SQL. Этот эквивалент SQL делает сравнение нечувствительным к регистру (это зависит от настроек базы данных, но обычно это значение по умолчанию).

С другой стороны, он не может проанализировать исходный код вашей пользовательской функции и поэтому не может перевести его в SQL и должен просто выполнить его в памяти после предварительной загрузки результата предыдущего запроса из база данных. Это означает, что он выполняется как код .NET, где сравнение выполняется по умолчанию с учетом регистра.

Это может быть причиной вашего несоответствия результатов;)

1 голос
/ 21 февраля 2010

Linq работает с выражениями, а не со скомпилированными функциями. Будет хорошо, если вы используете выражение> вместо «скомпилированного» метода.

...