1

我正在使用 LINQ to NHibernate 并在比较字符串时遇到了一个奇怪的问题。以下代码工作正常,但是当我取消注释时: //MyCompareFunc(dl.DamageNumber, damageNumberSearch) && 和评论:dl.DamageNumber.Contains(damageNumberSearch) && 然后它崩溃了,似乎 MyCompareFunc() 在 dl 时总是返回 true。 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);
    }
4

2 回答 2

2

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

另一方面,他无法解析您的自定义函数的源代码,因此无法将其转换为 SQL,只能在从数据库中预加载上一个查询的结果后在内存中执行它。这意味着它作为 .NET 代码执行,默认情况下进行比较区分大小写。

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

于 2010-02-21T09:43:25.803 回答
1

Linq 使用表达式,而不是编译函数。如果您使用 expression> 而不是“已编译”方法,那就没问题了。

于 2010-02-21T11:41:59.637 回答