2016-03-09 50 views
1

我的問題開始試圖找到一個區分大小寫的比較來使用NHibernate。在NHibernate中檢查大小寫。任何在NHibernate中

public List<MessageLog> GetLogsByFileAndEventName (string fileName, string eventName, DateTime? after, 
    DateTime? before) 
    { 
    var query = m_session.QueryOver<Log>() 
     .Where (x => x.CreatedOn >= after && x.CreatedOn <= before); 

    if (fileName != null) 
     (2) query = query.Where (x => x.FileName.Equals (fileName)); 
    if (eventName != null) 
     (3) query = query.Where (x => x.LogRecords.Any (y => y.Event.Name.Equals (eventName))); 

    return query.List<Log>().ToList(); 
    } 

我現在已經替換線路2與

query = query.Where (Expression.Sql (" FileName = ? COLLATE Latin1_General_CS_AS", fileName, NHibernateUtil.String)); 

這產生了區分大小寫的比較。我在比較事件名稱(第3行)時嘗試使用類似的行爲,但是這會導致與參數不匹配。

編輯:我已經試過

query = query.Where (x => x.Records.Any(Expression.Sql (" SomeEvent.Name = ? COLLATE Latin1_General_CS_AS", eventName, NHibernateUtil.String))); 

這導致"Argument type 'Nhibernate.Criterion.AbstractCriterion' is not assignable to parameter type 'System.Func<projectname.Dir.Nhibernate.Logs.LogRecord, bool>'

我試過一對夫婦使用LINQ其他方式(我是相當新的話)不產生結果,我想在案件比較之前。

我的問題:

什麼會在3線檢查大小寫事件名稱的最好方法?

+0

你的第三個linq例子看起來不對。你對'.Where(...)!= null'的期望是什麼?在語義上,它應該總是成真。我想它應該是'.Any(...)'而不是。 –

+0

你可以包括你已經嘗試過的第3行嗎?就像'query.Where(x => x.Records.Any(Expression.Sql(「SomeEvent.Name =?COLLATE Latin1_General_CS_AS」,eventName,NHibernateUtil.String)));'? –

+0

感謝您的回覆!當我複製第3行時,我無意中複製了一直使用Expression.Sql而不是原始.Any()進行嘗試的表達式之一。 – Speerian

回答

1

您正在使用QueryOver API,它不是linq API。它可以使用lambda表達式作爲linq,但它不是linq。

我相信你有一個異常,但你有一個編譯錯誤,而不是。您不能將NHibernate標準(Expression.Sql生成標準)與linq方法結合使用(Any是linq方法,而在您的代碼中query.Where是QueryOver方法)。

如果你想使用linq,你應該使用linq-to-nhibernate來代替。

using NHibernate.Linq; 
... 
var query = m_session.Query<Log>(); 

據我所知,linq-to-nibernate不支持指定排序規則。但是您可以擴展它,如another need herehere所示。

如果你想使用QueryOver,使用LINQ子查詢(在任何的)不看我的方式子查詢都應該與QueryOver表示。我對QueryOver不熟悉,您應該理清如何從文檔中表達額外的限制。或者問一個關於它的新問題。