0

Linq to Entities(Oracle 11g)リクエストの作成に問題があります。これが、ID、STATE、およびAPPLICATIONの3つの列(簡略化されたバージョン)のテーブルTREATMENTです。ここにサンプルがあります:

ID  STATE   APPLICATION
1   A       MAJ
2   A       FLUX
3   A       FLUX
4   R       REF
5   A       REF

今、私の目的は、これらのルールを使用してデータを取得することです。

  • 状態はA(追加)である必要があります
  • 最大値を下回るアプリケーションあたりの行数
  • 最大値はマイナー化されますb状態=Rの行数(アプリケーションごと)

例:最大値が1の場合、行1と2を取得する必要があります(状態R(行4)のREFが既に存在するため、行5を取得できません)

Rの数が最大値以上の場合、なんとかすべての行を取得できますが、最大値を尊重するために結果の数を制限する方法がわかりません。

これがリクエストです:

using (Entities bdd = new Entities())
{
    var treatments = from trt in bdd.TREATMENT
                     let app = from t in bdd.TREATMENT
                               where t.STATE == "R"
                               group t by t.APPLICATION into grouped
                               where grouped.Count() >= maxPerApplication
                               select grouped.Key
                     where trt.STATE == "A" && !app.Contains(trt.APPLICATION)
                     orderby trt.ID
                     select new TreatmentDto()
                     {
                         Id = trt.ID
                     };

    result = treatments.ToList();
}

SQLでは、内部リクエストとROWNUMを使用して結果の数を制限しますが、その方法がわかりません。私が見る唯一の解決策は、2つの部分でリクエストを実行することですが、情報の一貫性を維持するために、これを避けたいと思います。

4

1 に答える 1

0

私は解決策を見つけました、それが最良かどうかはわかりませんが、それはうまくいきます:

using (Entities bdd = new Entities())
{
    from trt in bdd.TREATMENT
    where trt.STATE == "A" &&
    (from trt2 in bdd.TREATMENT
    where trt2.STATE == "A" && trt2.APPLICATION == trt.APPLICATION && trt2.ID <= trt.ID
    select trt2).Count() <= maxPerApplication - (from appp in bdd.TREATMENT
                                                 where appp.STATE == "R" 
                                                 && appp.APPLICATION.Equals(trt.APPLICATION) 
                                                 select appp).Count()
    select new TreatmentDto()
    {
     Id = trt.ID
    };

    result = treatments.ToList();
}
于 2012-08-20T16:07:09.473 に答える