我在创建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
现在,我的目标是使用这些规则检索数据:
例子:如果最大值为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来限制结果的数量,但我不知道如何做到这一点。我看到的唯一解决方案是分两部分执行请求,但我希望避免这种情况以保持信息的一致性。
答案 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();
}