【问题标题】:Strange problem with LINQ to NHibernate and string comparisonLINQ to NHibernate 和字符串比较的奇怪问题
【发布时间】:2010-02-21 19:41:59
【问题描述】:

我正在使用 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);
    }

【问题讨论】:

    标签: linq nhibernate linq-to-nhibernate


    【解决方案1】:

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

    另一方面,他无法解析自定义函数的源代码,因此无法将其转换为 SQL,只能在从数据库。这意味着它作为 .NET 代码执行,默认情况下会区分大小写。

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

    【讨论】:

    • 谢谢托马斯,但在我的特殊情况下,比较是通过数字完成的。事实上,我在 "MyCompareFunc" 中对 string.Contains 的使用类似于:"1".Contains("12345")
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2011-04-07
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多