2

こんにちは私はNHibernateを初めて使用し、少し混乱しています。

製品テーブルがあるとします。productテーブルにprice1とprice2の2つの列があるとします。

次に、次のようにHQLを介してマップされた製品エンティティを照会できます。

string queryString = @"from product p
where p.price1 = p.price2 + 100 ";
IList result = session.CreateQuery(queryString).List();

ICriteriaAPIを介してそれを達成するにはどうすればよいですか。

私はそれがばかげていることを知っていますが、私はそのようなsthを試みています:

session.CreateCriteria(typeof(product))
   .Add(Expression.Eq("price1", "price2" + 100))
   .List()

またはより適切にはそのようなsth(ラムダ拡張を使用):

session.CreateCriteria(typeof(product))
   .Add<product>(p => p.price1 == (p.price2 + 100))
   .List()

実際、ラムダ拡張プロジェクトをgooglecodeからダウンロードし、それを拡張して、バイナリ式と単項式を再帰的に処理し、次のような表現を実装しました。

session.CreateCriteria(typeof(product))
   .Add<product>(p => 
               (!(p.price1 > 29007) && (p.price1 > 19009)) 
            || (p.price2 == 29009));

私は現在、上記のようなクエリを処理していますが、必要な基準を取得するための適切な制限を返すことができないため、算術句が煩わしいです。

mpffhはそれを包括的に説明しようとするのにうんざりしています。私はそれがうまくいったことを願っています。どんな助けでも大歓迎です。

4

1 に答える 1

1

あなたはこれを試すことができます:

ISQLFunction sqlAdd = new VarArgsSQLFunction("(", "+", ")");
var products = session
    .CreateCriteria<product>()
    .Add(
        Expression.EqProperty(
            "price1", 
            Projections.SqlFunction(
                sqlAdd, 
                // TODO: replace this with appropriate type
                NHibernateUtil.Double,
                Projections.Property("price2"),
                Projections.Constant(100) 
            )
        )
    )
    .List<product>();
于 2009-11-19T11:01:45.053 に答える