EF问题与服务器上的分组

时间:2013-02-28 14:09:09

标签: c# linq entity-framework-5

当我使用实体框架进行分组时,我遇到了这个问题。

.Net:4.5,EF:5.0,数据库:Oracle

我的问题是当我在服务器上分组并获取数据时,分组数据(实体列表)反复返回所有分组数据的第一条记录 - 但组KEY是正确的。

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

x.D = string rest是整数/字符串混合。

以下代码不起作用:

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();

2 个答案:

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

答案 1 :(得分:0)

我发现LINQPad可用于诊断此类问题。查询Oracle表并从结果选项卡切换到 SQL 选项卡,请注意第一个示例如何产生一个初始SQL select,然后是多个后续select语句对于实现所需的正确分组没有用处。对我来说看起来像个错误。

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

在数据库连接上使用GroupBy时似乎需要小心;早期评估(例如转换为列表)可以更快更准确,这样我们就可以使用LINQ来获取数据了。

使用repro更新案例

首先是Oracle(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驱动程序的查询示例:

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在SQL选项卡中报告的实际奇怪查询,导致根本没有有用的分组:

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 to SQL。 (我的LINQPad报告LINQPad驱动程序是IQ V2.0.7.0,如果有帮助的话)。

相关问题