0

我在创建 Linq to Entities (Oracle 11g) 请求时遇到问题。这是我有一个三列的表 TREATMENT(简化版):ID、STATE 和 APPLICATION。这是一个示例:

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

现在,我的目标是使用这些规则检索数据:

  • 状态必须是 A(添加)
  • 每个应用程序的行数低于最大值
  • 最大值由 State = R 的行数次要(每个应用程序)

示例:如果最大值为 1,我必须检索第 1 行和第 2 行。(无法检索第 5 行,因为已经存在状态为 R 的 REF(第 4 行))

当 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 来限制结果的数量,但我不知道该怎么做。我看到的唯一解决方案是分两部分进行请求,但我想避免这种情况以保持信息的一致性。

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 回答