当我使用实体框架进行分组时,我遇到了这个问题。
.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();
答案 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,如果有帮助的话)。