как перевести «где (r.value1 - r.value2> 0,01)» в NHibernate - PullRequest
0 голосов
/ 14 марта 2012

Я конвертирую MSSQL-запрос в NHibernate. По сути это мой SQL:

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)

Я уверен, что есть способ позволить базе данных выполнять вычисления. Кто-нибудь знает?

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Предикаты в QueryOver.Where (), как правило, могут быть только очень простыми выражениями сравнения. QueryOver не поддерживает арифметические операции внутри делегатов (r.Value1 - r.Value2). Как отметил @Rippo, вам нужно вернуться к ICriterion.

.QueryOver<MyType>()
    .Where(
        Expression.Gt(
          Projections.SqlProjection("{{alias}}.rValue1 - {{alias}}.rValue2", null, null), 
          0.01
        )
    )
0 голосов
/ 06 марта 2015

Читая об этом, я хотел поделиться решением, которое оказалось в производстве: отображение формулы только для чтения в FluentNHibernate.

модель должна иметь свойство, подобное этому:

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

и это свойство должно отображаться следующим образом:

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

строковый параметр метода Formula заканчивается запросом SQL Select, подобным этому:

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

Обратите внимание, что вычисляемое свойство должно иметь защищенный установщик, или NHibernate сгенерирует исключение, сообщающее, что установщик недоступен.

0 голосов
/ 14 марта 2012

В SQL-запросе вы используете «MyTable», но в QueryOver: «MyType»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...