C# 按JsonDocument和x27分组;使用实体框架核心的具有未知类型的属性
我使用的是实体框架核心3.1.5 我试图通过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
JsonDocument
的某些属性对实体进行分组,我不知道它的类型。
AdditionalData
是实体的JsonDocument
属性
我需要在数据库上执行命令
我设法做到这一点有两个限制
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();