C# EF核心按列区分
在EF 6中,如果我想通过不同的姓氏选择用户,我可以这样做:C# EF核心按列区分,c#,sql-server,entity-framework,entity-framework-core,C#,Sql Server,Entity Framework,Entity Framework Core,在EF 6中,如果我想通过不同的姓氏选择用户,我可以这样做: var users = _context.User .GroupBy(x => x.LastName) .Select(x => x.FirstOrDefault()) .OrderBy(x => x.LastName) .Take(10) .ToList(); 在EF Core 3.1.6中,同
var users = _context.User
.GroupBy(x => x.LastName)
.Select(x => x.FirstOrDefault())
.OrderBy(x => x.LastName)
.Take(10)
.ToList();
在EF Core 3.1.6中,同样的查询给了我以下例外情况:
System.InvalidOperationException: The LINQ expression '(GroupByShaperExpression:
KeySelector: (u.LastName),
ElementSelector:(EntityShaperExpression:
EntityType: User
ValueBufferExpression:
(ProjectionBindingExpression: EmptyProjectionMember)
IsNullable: False
)
)
.FirstOrDefault()' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync()
有没有任何方法可以在不使用可数(或其他替代方法)的情况下使用该查询,从而将整个庞大的表加载到内存中?我在下面使用的数据库是Microsoft SQL Server 2014,它可以处理此类查询。EF Core 5可能支持此类查询(EF Core GitHub存储库中肯定存在未解决的问题) EF Core 3.x中的解决方法类似于-(1)使用子查询选择不同的键值,(2)然后将其与主查询结合使用限制运算符连接/关联(在本例中,
Take(1)
):
var users=\u context.User.Select(x=>x.LastName.Distinct()/(1)
.SelectMany(key=>_context.User.Where(x=>x.LastName==key)。Take(1))/(2)
//其余部分与原点相同
.OrderBy(x=>x.LastName)
.Take(10)
.ToList();
这不是很可怕吗?甚至LINQ到SQL都能正确地翻译它!这项工作已经够花哨了,但这样的限制会让许多开发人员望而却步。嗯,你知道这一切。值得一提的一个缺点是,投影仍然会选择子查询中的整个记录,并且只影响主查询的字段列表。除非您愿意在子查询中重复投影(包括分组键)。唉…@Gert有趣(或悲伤?)的事情是,SelectMany
生成的连接子查询使用的是ROW\u NUMBER()OVER(partitionby…
与where ROW组合)