2012-08-07 53 views
0

在NHibernate中,使用標準的API做這樣的語句的時候,我有這樣的事情:NHibernate的倒車Restrictions.Like參數

query.Add(Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId1), OrderId2, MatchMode.Anywhere)); 

哪裏Order2只是一個局部的字符串參數。

這就產生這樣的查詢(你可以用 「AB10002」 替換Order2):

...WHERE Order.OrderId1 LIKE '%OrderId2%' 

但我也想檢查:

... OR OrderId2 LIKE「%訂單。 OrderID1%」

是,即使可能嗎?

*之類的限制不允許投射財產作爲第二個參數,這就是爲什麼我不知道如何「扭轉」等。

回答

0

您可以鏈Add的,或者你應該能夠使用Restrictions.Or兩個InsensitiveLike的:

query.Add(Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId1), OrderId2, MatchMode.Anywhere)) 
.Add(Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId2), OrderId1, MatchMode.Anywhere)); 

// ... or ... 

query.Add(
    Restrictions.Or(
     Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId1), OrderId2, MatchMode.Anywhere, 
     Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId2), OrderId1, MatchMode.Anywhere 
    ) 
); 

我無力的時刻,但來自記憶這是我會怎麼做,以測試這它。

編輯:在回答你的評論,你可以移動從類型安全的API中,並使用一些字符串。該Expression.Like方法有一個字符串值,屬性名的過載。也許這樣的事情?:

query.Add(Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId1), OrderId2, MatchMode.Anywhere)) 
    .Add(Expression.Like(OrderId2.ToString(), string.Concat("%", Projections.Property<Order>(a => a.OrderId1), "%"))); 

您可能需要增加一個,並在那裏,以及(儘管我並不需要)。

+0

我應該指定OrderId2不是訂購的屬性。我已更新了我的原始文章 – getit 2012-08-08 00:05:47

+0

我編輯了我的答案。 – 2012-08-08 00:50:37

+0

謝謝,但它仍然無法正常工作。它編譯,但如果我使用搜索字符串,例如「a」,我得到以下錯誤:無法解析屬性:'a':Order – getit 2012-08-08 02:05:59