Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF核心按列区分_C#_Sql Server_Entity Framework_Entity Framework Core - Fatal编程技术网

C# EF核心按列区分

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中,同

在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中,同样的查询给了我以下例外情况:

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组合)