Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 如何使用EF 3.1为实体框架GroupBy中的每个组选择前N行_Entity Framework_Group By_Entity Framework Core_Ef Core 3.1 - Fatal编程技术网

Entity framework 如何使用EF 3.1为实体框架GroupBy中的每个组选择前N行

Entity framework 如何使用EF 3.1为实体框架GroupBy中的每个组选择前N行,entity-framework,group-by,entity-framework-core,ef-core-3.1,Entity Framework,Group By,Entity Framework Core,Ef Core 3.1,我需要在带有实体框架的表中为每个组获取前10行。 基于其他解决方案,我尝试了两件事: var sendDocuments = await context.Set<DbDocument> .Where(t => partnerIds.Contains(t.SenderId)) .GroupBy(t => t.SenderId) .Select(t => new { t.Key, Documents = t

我需要在带有实体框架的表中为每个组获取前10行。 基于其他解决方案,我尝试了两件事:

var sendDocuments = await context.Set<DbDocument>
    .Where(t => partnerIds.Contains(t.SenderId))
    .GroupBy(t => t.SenderId)
    .Select(t => new
    {
        t.Key,
        Documents = t.OrderByDescending(t2 => t2.InsertedDateTime).Take(10)
    })                
    .ToArrayAsync();

var sendDocuments2=wait context.Set
.Where(t=>partnerId.Contains(t.SenderId))
.GroupBy(t=>t.SenderId)
.SelectMany(t=>t.OrderByDescending(t2=>t2.InsertedDateTime)。取(10))
.ToArrayAsync();
错误:

System.InvalidOperationException: 'The LINQ expression
'(GroupByShaperExpression: KeySelector: (d.SenderId), 
ElementSelector:(EntityShaperExpression: 
    EntityType: DbDocument
    ValueBufferExpression: 
        (ProjectionBindingExpression: EmptyProjectionMember)
    IsNullable: False ) )
    .OrderByDescending(t2 => t2.InsertedDateTime)' 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().
System.InvalidOperationException:'处理LINQ表达式 't=>t .OrderByDescending(t2=>t2.InsertedDateTime) .AsQueryable() 。通过“NavigationExpandingExpressionVisitor”获取(10)”失败。这可能表明EF核心中存在缺陷或限制


还有其他想法吗?

这是一个常见问题,不幸的是,EF Core 3.0/3.1查询转换器不支持专门针对
GroupBy

解决方法是通过关联两个子查询来手动进行摸索,一个子查询用于键,另一个子查询用于相应的数据

把它应用到你的例子中会是这样的

如果您需要(键、项目)对:

var query=context.Set()
.Where(t=>partnerId.Contains(t.SenderId))
.Select(t=>t.SenderId).Distinct()//新建
{
键=键,
文件=
context.Set().Where(t=>t.SenderId==key)//t.InsertedDateTime.Take(10)
.ToList()//partnerId.Contains(t.SenderId))
.Select(t=>t.SenderId).Distinct()//context.Set().Where(t=>t.SenderId==key)//t.InsertedDateTime.Take(10)
);

您可以提供sql查询的操作方法吗?或者您可以提供表结构吗?context.Set.FromSqlRaw amd write group by query在有多个键的情况下,第一个查询不起作用。它总是得到一个键。这在很多方面对我都有帮助,我无法解释。在执行GroupBy(x=>x.key)时,将其转换为Select(x=>x.key).Distinct().SelectMany(key=>.Where(t=>t.key==key)。
var sendDocuments2 = await context.Set<DbDocument>
    .Where(t => partnerIds.Contains(t.SenderId))
    .GroupBy(t => t.SenderId)
    .SelectMany(t => t.OrderByDescending(t2 => t2.InsertedDateTime).Take(10))
    .ToArrayAsync();
var query = context.Set<DbDocument>()
    .Where(t => partnerIds.Contains(t.SenderId))
    .Select(t => t.SenderId).Distinct() // <--
    .Select(key => new
    {
        Key = key,
        Documents = 
            context.Set<DbDocument>().Where(t => t.SenderId == key) // <--
                 .OrderByDescending(t => t.InsertedDateTime).Take(10)
                 .ToList() // <--
    });
var query = context.Set<DbDocument>()
    .Where(t => partnerIds.Contains(t.SenderId))
    .Select(t => t.SenderId).Distinct() // <--
    .SelectMany(key => context.Set<DbDocument>().Where(t => t.SenderId == key) // <--
        .OrderByDescending(t => t.InsertedDateTime).Take(10)
    );