0

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

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

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

如果我没有按预期按记录返回进行分组,但我有一些分组要求,我的解决方法是……是的,这不会让我感觉很好,代码应该可以工作……但事实并非如此。

xD = 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();
4

2 回答 2

0

我发现 LINQPad 在诊断这类问题时很有用。查询 Oracle 表并从Results选项卡切换到SQL选项卡,请注意第一个示例如何生成一个初始 SQL select,然后是多个后续select语句,这些语句对于实现所需的正确分组没有用处。对我来说似乎是一个错误。

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

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

更新复制案例:

首先是 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,如果有帮助的话)。

于 2013-12-12T15:43:28.663 回答
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();
于 2013-02-28T14:26:01.917 回答