2009-08-20 112 views
1

現在,我有這樣的事情在NHibernate的:IFNULL NHibernate的

Expression.Like(property, value, MatchMode.Anywhere) 

和生成SQL這樣的:

property LIKE '%value%' 

這是罰款,這種情況下。在另一種情況下,我想要的SQL:

IFNULL(property LIKE '%value%', 0) 

,但我不認爲這是指IFNULL手冊中的任何例子,我也甚至可以找到任何純醇」 API文檔。

我發現了Expression.Sql(),但只是手冊中的一個例子,它讓我感到有點不滿,因爲我沒有看到任何真正的文檔,並且使用SQL自己做任何事情當我使用NHibernate試圖擺脫這一點。

是否有更好的方法在NHibernate中執行IFNULL比Expression.Sql()?

+1

作爲一個側面說明,你應該使用COALESCE因爲這是ANSI標準,同時isnull的是T-SQL特有的。 – 2009-08-20 22:52:27

+0

我不知道「t-sql」是什麼,但我會記下這一點。謝謝! – Ken 2009-08-21 16:40:54

+0

t-sql是transact sql,是microsoft sql server和sybase使用的sql的特定方言。 – 2009-08-21 21:39:31

回答

2

我假設這是在WHERE子句中,此時IFNULL(property LIKE '%value%', 0)不是有效的SQL,因爲LIKE的計算結果爲true或false,並且0也不是這些。

我懷疑你真的想要property LIKE '%value%' OR property IS NULL

如果是這樣的話:

.Add(
    Expression.Disjunction() 
    .Add(Expression.Like(property, value, MatchMode.Anywhere)) 
    .Add(Expression.IsNull(property)) 
) 
+0

我想你的意思是不是NULL而不是OR NULL,但是我能夠使用這個策略來創建一個適用於我的表達式。 – Ken 2009-08-21 16:42:16

+0

如果你不想要nulls爲什麼你甚至會使用coalesce呢?你可以直接使用LIKE,因爲它永遠不會匹配null,因此x LIKE'值'AND x IS NOT NULL與移除IS NOT NULL完全相同。 – 2009-08-21 21:38:34

+0

因爲「COALESCE(x LIKE y,false)」看起來比「(x LIKE y)AND(x IS NOT NULL)」更簡單,更直接。當x = NULL時,只需使用「x LIKE y」就會產生NULL,這是完全不同的 - 特別是當在Expression.Not()中使用時,NULL仍爲NULL。 – Ken 2009-08-21 22:42:50

0

它本身不是一個答案,但我建議你去尋找COALESCE()Here你可以看到爲什麼。

+0

這很整潔,如果我想要使用ISNULL(我不在這裏),我一定會檢查出來。 :-) – Ken 2009-08-21 16:45:15