LINQ to NHibernate和字符串比较的奇怪问题

时间:2010-02-21 09:28:53

标签: linq nhibernate linq-to-nhibernate

我正在使用LINQ to NHibernate并在比较字符串时遇到一个奇怪的问题。以下代码工作正常,但当我取消评论时: //MyCompareFunc(dl.DamageNumber,damageNumberSearch)&& 和评论: dl.DamageNumber.Contains(damageNumberSearch)&& 然后它崩溃了,似乎MyCompareFunc()总是返回true,而dl.DamageNumber.Contains(damageNumberSearch)有时会返回true,有时会返回false。

换句话说,当我在LINQ查询中直接使用string.Contains()时,它可以工作,但当我将它移动到某个方法时,它不起作用。

    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 个答案:

答案 0 :(得分:2)

我不得不承认我不是NHibernate的专家,但是在使用不同的ORM时我们经常遇到同样的问题。问题在于LINQ引擎在翻译查询时能够识别来自.NET库的简单字符串函数,如Contains并将它们转换为SQL等价物。此SQL等效项对比较不区分大小写(它取决于数据库的设置,但这通常是默认设置)。

另一方面,他不可能解析自定义函数的源代码,因此无法将其转换为SQL,并且必须在从上一个查询的结果预加载之后才在内存中执行它。数据库。这意味着它作为.NET代码执行,默认情况下,比较完成。

这可能是导致结果不匹配的原因;)

答案 1 :(得分:1)

Linq使用表达式,而不是编译函数。如果你使用表达式&gt;那就没问题了。而不是“编译”的方法。

相关问题