gpt4 book ai didi

c# - 在按匿名类型分组的 Entity Framework 查询中选择分组键最终为每个分组对象返回一个键

转载 作者:太空宇宙 更新时间:2023-11-03 13:21:32 25 4
gpt4 key购买 nike

我有这张 table

ID        Name        City    ... more columns
----------------------------------------------
1 Nate Boston ...
2 John Boston ...
2 John Boston ...
3 Sam Austin ...

(由于我无法控制的原因,在某些情况下 ID 重复)

我为此设置了一个 Entity Framework 模型,总的来说它运行良好。我在尝试获取唯一列表时遇到问题。

var result = db.table.GroupBy(t => new
{
ID = t.ID,
Name = t.Name,
City = t.City
}).Select(g => g.Key)

问题是,此查询返回以下内容:

ID        Name        City    
-----------------------------
1 Nate Boston
2 John Boston
2 John Boston
3 Sam Austin

我觉得我快疯了,所以我启动了 LinqPad,运行相同的查询并得到了预期的结果:

ID        Name        City   
-----------------------------
1 Nate Boston
2 John Boston
3 Sam Austin

我意识到使用 LinqPad 我是通过 Linq-To-SQL 连接到我的数据库的,而不是使用 LinqPad 的 EntityFramework 提供程序。当我使用 EntityFramework 通过我的程序集连接 LinqPad 时,我得到了与我的真实项目中相同的结果。

我错过了什么导致 Entity Framework 和 Linq-To-SQL 对同一查询返回不同的结果,我怎样才能获得与 Linq-To-SQL 相同的结果?

我应该指出,在 LinqPad 中,如果我删除 .Select(g => g.Key); 结果会按预期显示在快速 View 中(Key 是唯一的每个分组,以及 2, John, Boston 记录有两个子元素)。


作为引用,生成的 SQL。

这是从 Linq-To-SQL 生成的 SQL:

SELECT [t0].[ID], [t0].[Name], [t0].[City]
FROM [Table] AS [t0]
GROUP BY [t0].[ID], [t0].[Name], [t0].[City]

这是从 Entity Framework 生成的 SQL:

SELECT 
1 AS [C1],
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[City] AS [City]
FROM (SELECT
[Table].* -- I changed this to .* because EF code listed all column in table explicitly
FROM [dbo].[Table] AS [Table]) AS [Extent1]

最佳答案

@Gusman 带我找到解决方案。对于 EntityKey 问题,我认为这一定是一个 Entity Framework 的问题,与 ID 的比较有关,因为存在重复项。

我使用 Linq-To-Objects 重新编写了如下查询,我确实得到了预期的结果。这里的关键是在 .ToList() 之后执行 .GroupBy(...) 以便在内存中比较值,其中使用 C# 规则而不是数据库或 Entity Framework 比较规则。

var result = db.table
.Select(t =>
{
ID = t.ID,
Name = t.Name,
City = t.City
}) // project only used columns, to reduce data from db => web server
.ToList() // convert from Linq-To-Entities, to Linq-To-Objects
.GroupBy(t => new
{
ID = t.ID,
Name = t.Name,
City = t.City
})
.Select(g => g.Key)

我假设这是某种 Entity Framework 优化(Linq-To-SQL 不会这样做),在我的重复 ID 情况下会重新触发。

因为无论如何我都需要枚举所有返回的数据,所以 .ToList() 调用对我来说还不错。虽然我的表很宽,所以我执行了额外的 .Select(t => new { ... }) 以减少从数据库服务器返回的列数,因为我不会从 lazy 中受益在 .ToList() 之后加载。

关于c# - 在按匿名类型分组的 Entity Framework 查询中选择分组键最终为每个分组对象返回一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23944345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com