2012-03-14 21 views
0

我正在將MSSQL查詢轉換爲NHibernate。從本質上說,這是我的SQL:如何將「where(r.value1 - r.value2> 0.01)」轉換爲NHibernate

SELECT * FROM MyTable as T 
WHERE (T.Value1 - T.Value2 > 0.01) 

這是我的C#代碼:

var query = QueryOver.Of<MyType>() 
    .Where(r => (r.Value1 - r.Value2 > 0.01)); 

和它給我一個例外:

Could not determine member from (r.Value1 - r.Value2) 

我敢肯定有辦法讓數據庫進行計算。有人知道嗎?

+2

我想你可能需要去ICriteria甚至HQL這裏。 – Rippo 2012-03-14 14:59:15

回答

0

回想起來,我想分享最終生產的解決方案:在FluentNHibernate中映射只讀公式。

模型需要有這樣的性質:

public virtual decimal Difference { get { return Value2 - Value1; } protected set; }

和該屬性應如下映射:

Map(x => x.Difference).Formula("(Value2 - Value1)").Readonly();

式方法的字符串參數結束在SQL Select查詢中,類似於:

Select Id, Value1, Value2, (Value2 - Value1) from MyTable...

請注意,計算的屬性需要一個受保護的setter,否則NHibernate將拋出一個異常,表示沒有setter可用。

0

在SQL查詢中使用 「MyTable的」,但在QueryOver: 「MyType的」 內QueryOver.Where

+0

是的,在現實生活中,我使用的是甚至不同的值,所以它可能是最好的,這只是一個例子*** 此外,任何以My爲前綴的變量的程序員應該被拍攝或至少被解僱。但這與我的問題無關。 – increddibelly 2012-03-14 13:14:26

+0

然而,你是對的。看看「NHibernate.Criterion.Restrictions」和「NHibernate.Criterion.Expression」,可能是幫助。 – Anton 2012-03-14 14:20:33

1

謂詞()一般只能是很簡單的比較表達式。 QueryOver不支持委託內的算術運算(r.Value1 - r.Value2)。正如@Rippo指出的那樣,您需要回退到ICriterion。

.QueryOver<MyType>() 
    .Where(
     Expression.Gt(
      Projections.SqlProjection("{{alias}}.rValue1 - {{alias}}.rValue2", null, null), 
      0.01 
     ) 
    ) 
相關問題