2013-02-28 40 views
0

当我正在用实体框架进行分组时,我遇到了这个问题。与服务器上的分组的EF问题

净:4.5,EF:5.0,数据库:Oracle

我的问题是,当我在分组服务器上并取回数据,分组数据(实体的名单)用返回的第一个记录并结束所有分组数据 - 但组的KEY是正确的。

如果我不按预期的方式按照记录返回一个组,但是我有一些分组要求,我的解决方法是...是的,没有让我觉得这很好,代码应该工作......但它确实不。

x.D =字符串休息是整数/字符串混合。

这里是一个没有工作的代码:

db.ENTITY_NAME 
.Where(x => 
     wantedGs.Contains(x.G) && 
     wantedAs.Contains(x.A) 
    ) 
.GroupBy(x => x.D) 
.ToList() 
.Select(x => x.FirstOrDefault()) 
.Select(x => new MyEntity 
    { 
     A = x.A, 
     B = x.B, 
     C = x.C, 
     E = x.E, 
     D = x.D, 
     F = x.F, 
     G = x.G 
    }) 
.ToList(); 

这里是我设法做我想做的变通方法:

db.ENTITY_NAME 
.Where(x => 
     wantedGs.Contains(x.G) && 
     wantedAs.Contains(x.A) 
    ) 
.Select(x => new 
{ 
    x.A, 
    x.B, 
    x.C, 
    x.D, 
    x.E, 
    x.F, 
    x.G 
}) 
.ToList() 
.GroupBy(x => x.D) 
.Select(x => x.FirstOrDefault()) 
.Select(x => new MyEntity 
    { 
     A = x.A, 
     B = x.B, 
     C = x.C, 
     E = x.E, 
     D = x.D, 
     F = x.F, 
     G = x.G 
    }) 
.ToList(); 
+0

如果您只执行第一个查询的GroupBy(x => x.D),结果如何? – 2013-02-28 14:34:42

回答

0

如果这不起作用,请张贴一些样本显示问题的数据

db.ENTITY_NAME 
.Where(x => 
     wantedGs.Contains(x.G) && 
     wantedAs.Contains(x.A) 
    ) 
.GroupBy(x => x.D) 
.Select(x => x.FirstOrDefault()) 
.AsEnumerable() 
.Select(x => new MyEntity 
    { 
     A = x.A, 
     B = x.B, 
     C = x.C, 
     E = x.E, 
     D = x.D, 
     F = x.F, 
     G = x.G 
    }) 
.ToList(); 
0

我发现LINQPad在诊断这类问题时很有用。查询Oracle表并从结果选项卡切换到SQL选项卡,请注意第一个示例如何导致一个初始SQL select,后面是多个后续select语句,这些语句对于实现正确的分组并不有用需要。对我来说看起来像一个bug。

此问题似乎是Oracle特定的(可能是特定的客户端版本)。 Microsoft SQL Express数据库上的类似GroupBy给出了正确的结果,但也有多个SQL select

看来我们在数据库连接上使用GroupBy时需要小心;它可以更快更准确地评估早期(例如转换为列表),以便我们使用LINQ从这一点开始数据。

更新与摄制情况:

首先,甲骨文(9I)表的建立和行插入:

create table payees (
    name varchar2(10), 
    amount number(5)); 
insert into payees values ('JACK', 150); 
insert into payees values ('BARRY', 100); 
insert into payees values ('EMMA', 20); 
insert into payees values ('FLAVIA', 15); 
insert into payees values ('SYLVIA', 300); 
commit; 

好的和坏的LINQ语句(使用Oracle 9i客户机):

var good = Payees.ToList().GroupBy(p => p.Amount/100); 
var bad = Payees.GroupBy(p => p.Amount/100); 

一个查询的例子我想到了一个智能的LINQ to Oracle驱动程序使用:

在SQL选项卡
select trunc(amount/100) pay_category, name, amount 
from payees 
order by pay_category; 

PAY_CATEGORY NAME   AMOUNT 
------------ ---------- ---------- 
      0 EMMA    20 
      0 FLAVIA    15 
      1 JACK    150 
      1 BARRY    100 
      3 SYLVIA   300 

实际的陌生查询LINQPad报告,导致没有有用的分组都:

SELECT t0.AMOUNT 
FROM GENSYS.PAYEES t0 
GROUP BY t0.AMOUNT 

SELECT t0.AMOUNT, t0.NAME 
FROM GENSYS.PAYEES t0 
WHERE ((t0.AMOUNT IS NULL AND :n0 IS NULL) OR (t0.AMOUNT = :n0)) 
-- n0 = [15] 

SELECT t0.AMOUNT, t0.NAME 
FROM GENSYS.PAYEES t0 
WHERE ((t0.AMOUNT IS NULL AND :n0 IS NULL) OR (t0.AMOUNT = :n0)) 
-- n0 = [20] 

SELECT t0.AMOUNT, t0.NAME 
FROM GENSYS.PAYEES t0 
WHERE ((t0.AMOUNT IS NULL AND :n0 IS NULL) OR (t0.AMOUNT = :n0)) 
-- n0 = [100] 

SELECT t0.AMOUNT, t0.NAME 
FROM GENSYS.PAYEES t0 
WHERE ((t0.AMOUNT IS NULL AND :n0 IS NULL) OR (t0.AMOUNT = :n0)) 
-- n0 = [150] 

SELECT t0.AMOUNT, t0.NAME 
FROM GENSYS.PAYEES t0 
WHERE ((t0.AMOUNT IS NULL AND :n0 IS NULL) OR (t0.AMOUNT = :n0)) 
-- n0 = [300] 

我可能是期望太高了LINQ到SQL虽然。 (我的LINQPad报告LINQPad驱动程序是IQ V2.0.7.0,如果有帮助的话)。