C# 按JsonDocument和x27分组;使用实体框架核心的具有未知类型的属性

C# 按JsonDocument和x27分组;使用实体框架核心的具有未知类型的属性,c#,entity-framework,linq,group-by,entity-framework-core-3.1,C#,Entity Framework,Linq,Group By,Entity Framework Core 3.1,我使用的是实体框架核心3.1.5 我试图通过JsonDocument的某些属性对实体进行分组,我不知道它的类型。 AdditionalData是实体的JsonDocument属性 我需要在数据库上执行命令 我设法做到这一点有两个限制 我指定了属性的类型(使用GetInt32) 这些命令是在客户机上执行的,而不是在数据库上执行的 IEnumerable metricEntities=\u tenantDbContext.Set(); var ii2=metricEntities.Where(met

我使用的是实体框架核心3.1.5

我试图通过
JsonDocument
的某些属性对实体进行分组,我不知道它的类型。
AdditionalData
是实体的
JsonDocument
属性

我需要在数据库上执行命令

我设法做到这一点有两个限制

  • 我指定了属性的类型(使用GetInt32)
  • 这些命令是在客户机上执行的,而不是在数据库上执行的
  • IEnumerable metricEntities=\u tenantDbContext.Set();
    var ii2=metricEntities.Where(metric=>metric.Name==metricName).GroupBy(e=>
    e、 AdditionalData!.RootElement.GetProperty(groupByProperty.GetInt32())
    .选择(实体=>新建)
    {
    Count=entities.Count(),MetType=entities.Key,Ent=entities,
    }).ToList();
    
    我还设法做到了这一点,但没有得到结果中的所有实体 并且限制命令在客户机上执行,而不是在数据库上执行

    var i2 = _tenantDbContext.Set<MetricEntity>()
    .Where(metric => metric.Name == metricName)
    .GroupBy(e =>
        e.AdditionalData!.RootElement.GetProperty(groupByProperty).GetString())
    .Select(entities => new
    {
        Count = entities.Count(), MetType = entities.Key
    }).ToList();
    
    var i2=\u tenantDbContext.Set()
    .Where(metric=>metric.Name==metricName)
    .GroupBy(e=>
    e、 AdditionalData!.RootElement.GetProperty(groupByProperty).GetString()
    .选择(实体=>新建)
    {
    Count=entities.Count(),MetType=entities.Key
    }).ToList();
    
    但当我将实体添加到结果中时,如下所示:

    var i2 = _tenantDbContext.Set<MetricEntity>()
    .GroupBy(e =>
        e.AdditionalData!.RootElement.GetProperty(groupByProperty).GetString())
    .Select(entities => new
    {
        Count = entities.Count(), MetType = entities.Key, ent = entities,
    }).ToList();
    
    var i2=\u tenantDbContext.Set()
    .GroupBy(e=>
    e、 AdditionalData!.RootElement.GetProperty(groupByProperty).GetString()
    .选择(实体=>新建)
    {
    Count=entities.Count(),MetType=entities.Key,ent=entities,
    }).ToList();
    
    我得到以下异常:

    System.InvalidOperationException: Processing of the LINQ expression '(GroupByShaperExpression:
    KeySelector: ((m.AdditionalData)#>>{(@__groupByProperty_1)}),
    ElementSelector:(EntityShaperExpression:
        EntityType: MetricEntity
        ValueBufferExpression:
            (ProjectionBindingExpression: EmptyProjectionMember)
        IsNullable: False
    )
    )' by 'RelationalProjectionBindingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitExtension(Expression extensionExpression)
       at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(Expression expression)
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitNew(NewExpression newExpression)
       at System.Linq.Expressions.NewExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(Expression expression)
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Translate(SelectExpression selectExpression, Expression expression)
       at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateSelect(ShapedQueryExpression source, LambdaExpression selector)
       at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
       at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
       at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
       at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
       at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
       at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
    
    System.InvalidOperationException:处理LINQ表达式’(GroupByShapeExpression:
    键选择器:((m.AdditionalData)#>{(@uuuGroupByProperty_1)}),
    ElementSelector:(EntityShapeExpression:
    EntityType:MetricEntity
    ValueBufferExpression:
    (ProjectionBindingExpression:EmptyProjectionMember)
    IsNullable:False
    )
    )由“RelationalProjectionBindingExpressionVisitor”创建的“”失败。这可能表明EF核心中存在缺陷或限制。看见https://go.microsoft.com/fwlink/?linkid=2101433 更多详细信息。
    位于Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitExtension(表达式扩展Expression)
    at System.Linq.Expressions.Expression.Accept(ExpressionVisitor)
    位于System.Linq.Expressions.ExpressionVisitor.Visite(表达式节点)
    位于Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visite(表达式)
    位于Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitNew(NewExpression NewExpression)
    位于System.Linq.Expressions.NewExpression.Accept(ExpressionVisitor)
    位于System.Linq.Expressions.ExpressionVisitor.Visite(表达式节点)
    位于Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visite(表达式)
    在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Translate(选择表达式选择表达式,表达式表达式)
    位于Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslationExpressionVisitor.TranslateSelect(ShapedQueryExpression源,lambdaeExpression选择器)
    在Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslationExpressionVisitor.VisitMethodCall调用(MethodCallExpression MethodCallExpression)
    位于Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslationExpressionVisitor.VisitMethodCallExpression(MethodCallExpression MethodCallExpression)
    位于System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor)
    位于System.Linq.Expressions.ExpressionVisitor.Visite(表达式节点)
    位于Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](表达式查询)
    位于Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](表达式查询,布尔异步)
    位于Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase数据库、表达式查询、IModel模型、布尔异步)
    在Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.c__DisplayClass9_0`1.b__0()中
    位于Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](对象缓存键,Func`1编译器)
    位于Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOradQuery[TResult](对象缓存键,Func`1编译器)
    在Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](表达式查询)中
    在Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](表达式)中
    在Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()中
    位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
    
    每个
    group by
    查询应包含一个或多个键以及仅在select语句中具有聚合功能的其他属性(
    Sum
    Count
    等)。EF尝试将LINQ转换为SQL查询,并由于没有内部检查而引发异常

    有一个解决办法:

    GroupBy
    之前评估表数据。以下代码加载所有
    度量单位
    ,并将其分组为c代码:


    我需要在数据库中执行命令,而不是在客户端。在结果中,您将获得所有实体,因此不需要在执行查询的位置执行命令。从表中选择所有数据将比按条件分组和选择数据更快。这很重要,因为在我在问题中编写的操作之后,我计划以某种方式聚合数据(也在数据库中),因此我不会从数据库中获取所有实体。我负担不起从你那里收到成千上万的参赛作品
    System.InvalidOperationException: Processing of the LINQ expression '(GroupByShaperExpression:
    KeySelector: ((m.AdditionalData)#>>{(@__groupByProperty_1)}),
    ElementSelector:(EntityShaperExpression:
        EntityType: MetricEntity
        ValueBufferExpression:
            (ProjectionBindingExpression: EmptyProjectionMember)
        IsNullable: False
    )
    )' by 'RelationalProjectionBindingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitExtension(Expression extensionExpression)
       at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(Expression expression)
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitNew(NewExpression newExpression)
       at System.Linq.Expressions.NewExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(Expression expression)
       at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Translate(SelectExpression selectExpression, Expression expression)
       at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateSelect(ShapedQueryExpression source, LambdaExpression selector)
       at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
       at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
       at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
       at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
       at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
       at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
    
    var i2 = _tenantDbContext.MetricEntities
    .AsEnumerable()
    .GroupBy(e =>
        e.AdditionalData!.RootElement.GetProperty(groupByProperty).GetString())
    .Select(entities => new
    {
        Count = entities.Count(), MetType = entities.Key, ent = entities,
    }).ToList();