Linq - 按字段的相同值限制结果数

时间:2012-08-20 10:04:50

标签: entity-framework c#-4.0 entity-framework-4 linq-to-entities oracle11g

我在创建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(已添加)
  • 每个应用程序的行数低于最大值
  • 最大值为min,其中行数为State = R(每个应用程序)

例子:如果最大值为1,我必须检索第1行和第2行。(由于已经存在状态为R的REF(第4行),因此无法检索第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来限制结果的数量,但我不知道如何做到这一点。我看到的唯一解决方案是分两部分执行请求,但我希望避免这种情况以保持信息的一致性。

1 个答案:

答案 0 :(得分: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();
}