2010-02-21 53 views
1

我使用LINQ到NHibernate並在比較字符串時遇到一個奇怪的問題。下面的代碼工作正常,但是當我取消註釋: //MyCompareFunc(dl.DamageNumber,damageNumberSearch)& & 和評論: dl.DamageNumber.Contains(damageNumberSearch)& & 然後分解,並似乎MyCompareFunc()總是返回true,而dl.DamageNumber.Contains(damageNumberSearch)有時返回true,有時返回false。LINQ到NHibernate和字符串比較的奇怪問題

換句話說,當我在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

我不得不承認我不是NHibernate的專家,但在使用不同的ORM時,我們經常遇到同樣的問題。問題是,LINQ引擎在翻譯查詢時,能夠識別來自.NET庫的簡單字符串函數,如Contains,並將它們轉換爲SQL等效項。這個SQL等價物不區分大小寫(它取決於數據庫的設置,但通常是默認值)。

另一方面,他不可能分析自定義函數的源代碼,因此它不能將其轉換爲SQL,並且必須在預加載之前的查詢結果之後在內存中執行它數據庫。這意味着它是作爲.NET代碼執行的,其中比較是默認區分大小寫的。

這可能是你的結果不匹配的原因;)

+0

謝謝托馬斯,但在我的特殊情況下,比較是通過數字完成的。事實上,我在「MyCompareFunc」中對string.Contains的使用類似於:「1」.Contains(「12345」) – 2010-02-21 09:56:24

1

LINQ的工作與表達,而不是與compliled功能。如果使用expression>而不是「compiled」方法,那將會很好。