dotnetcore / EntityFrameworkCore.KingbaseES

Entity Framework Core provider for KingbaseES Database
PostgreSQL License
47 stars 6 forks source link

当在Linq中使用enum数组以及contains查询时,会报Cannot support multirange type mapping for range type #20

Open hatzhang opened 2 months ago

hatzhang commented 2 months ago

我在我的fork上推送了一个提交,来重现此问题。 概略如下:在测试项目中的Blog中添加新的enum属性


    [Table("blogs")]
    public class Blog
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }
        [Column("name")]
        public string Name { get; set; }
        public BlogType BlogType { get; set; }
    }

    public enum BlogType
    {
        Personal,
        Company
    }

    public class BlogFilter
    {
        public BlogType[] Type { get; init; }
    }

当做如下查询时,会报如题的例外

    // get
        var filter = new BlogFilter() { Type = new[] { BlogType.Company } };
        var testselect = context.Blogs.FirstOrDefault(q=>filter.Type.Contains(q.BlogType));

System.InvalidOperationException HResult=0x80131509 Message=Cannot support multirange type mapping for range type Source=DotNetCore.EntityFrameworkCore.KingbaseES StackTrace: 在 Kdbndp.EntityFrameworkCore.KingbaseES.Storage.Internal.KdbndpTypeMappingSource.FindCollectionMapping(RelationalTypeMappingInfo info, Type modelType, Type providerType, CoreTypeMapping elementMapping) 在 D:\Projects\EntityFrameworkCore.KingbaseES\src\EFCore.KingbaseES\Storage\Internal\KdbndpTypeMappingSource.cs 中: 第 527 行 在 Microsoft.EntityFrameworkCore.Storage.RelationalTypeMappingSource.<>c.b80(ValueTuple`4 k, RelationalTypeMappingSource self) 在 //src/EFCore.Relational/Storage/RelationalTypeMappingSource.cs 中: 第 199 行 在 System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd[TArg](TKey key, Func3 valueFactory, TArg factoryArgument) 在 Microsoft.EntityFrameworkCore.Storage.RelationalTypeMappingSource.FindMappingWithConversion(RelationalTypeMappingInfo mappingInfo, Type providerClrType, ValueConverter customConverter) 在 //src/EFCore.Relational/Storage/RelationalTypeMappingSource.cs 中: 第 140 行 在 Microsoft.EntityFrameworkCore.Storage.RelationalTypeMappingSource.FindMapping(Type type, IModel model, CoreTypeMapping elementMapping) 在 //src/EFCore.Relational/Storage/RelationalTypeMappingSource.cs 中: 第 385 行 在 Kdbndp.EntityFrameworkCore.KingbaseES.Query.KdbndpSqlExpressionFactory.ApplyTypeMappingsOnItemAndArray(SqlExpression itemExpression, SqlExpression arrayExpression) 在 D:\Projects\EntityFrameworkCore.KingbaseES\src\EFCore.KingbaseES\Query\KdbndpSqlExpressionFactory.cs 中: 第 625 行 在 Kdbndp.EntityFrameworkCore.KingbaseES.Query.Internal.KdbndpQueryableMethodTranslatingExpressionVisitor.TranslateContains(ShapedQueryExpression source, Expression item) 在 D:\Projects\EntityFrameworkCore.KingbaseES\src\EFCore.KingbaseES\Query\Internal\KdbndpQueryableMethodTranslatingExpressionVisitor.cs 中: 第 601 行 在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 //src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs 中: 第 187 行 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 //src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.cs 中: 第 263 行 在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.Translate(Expression expression) 在 //src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs 中: 第 62 行 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.Translate(Expression expression) 在 //src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.cs 中: 第 78 行 在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.TranslateSubquery(Expression expression) 在 //src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs 中: 第 549 行 在 Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 //src/EFCore.Relational/Query/RelationalSqlTranslatingExpressionVisitor.cs 中: 第 1007 行 在 Kdbndp.EntityFrameworkCore.KingbaseES.Query.Internal.KdbndpSqlTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 D:\Projects\EntityFrameworkCore.KingbaseES\src\EFCore.KingbaseES\Query\Internal\KdbndpSqlTranslatingExpressionVisitor.cs 中: 第 262 行 在 Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.TranslateInternal(Expression expression, Boolean applyDefaultTypeMapping) 在 //src/EFCore.Relational/Query/RelationalSqlTranslatingExpressionVisitor.cs 中: 第 152 行 在 Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.Translate(Expression expression, Boolean applyDefaultTypeMapping) 在 //src/EFCore.Relational/Query/RelationalSqlTranslatingExpressionVisitor.cs 中: 第 120 行 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateExpression(Expression expression, Boolean applyDefaultTypeMapping) 在 //src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.cs 中: 第 1826 行 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateLambdaExpression(ShapedQueryExpression shapedQueryExpression, LambdaExpression lambdaExpression) 在 //src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.cs 中: 第 1848 行 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateWhere(ShapedQueryExpression source, LambdaExpression predicate) 在 //src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.cs 中: 第 1279 行 在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 //src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs 中: 第 496 行 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 //src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.cs 中: 第 263 行 在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 //src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs 中: 第 132 行 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 //src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.cs 中: 第 263 行 在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.Translate(Expression expression) 在 //src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs 中: 第 62 行 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.Translate(Expression expression) 在 //src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.cs 中: 第 78 行 在 Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query) 在 //src/EFCore/Query/QueryCompilationContext.cs 中: 第 164 行 在 Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async) 在 //src/EFCore/Storage/Database.cs 中: 第 66 行 在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async) 在 //src/EFCore/Query/Internal/QueryCompiler.cs 中: 第 82 行 在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>cDisplayClass9_01.<Execute>b__0() 在 /_/src/EFCore/Query/Internal/QueryCompiler.cs 中: 第 66 行 在 Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func1 compiler) 在 //src/EFCore/Query/Internal/CompiledQueryCache.cs 中: 第 66 行 在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query) 在 //src/EFCore/Query/Internal/QueryCompiler.cs 中: 第 62 行 在 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression) 在 /_/src/EFCore/Query/Internal/EntityQueryProvider.cs 中: 第 64 行 在 KingbaseES.BasicTest.Program.Main(String[] args) 在 D:\Projects\EntityFrameworkCore.KingbaseES\test\KingbaseES.BasicTest\Program.cs 中: 第 46 行

hatzhang commented 1 month ago

@wangpengxpy @alexinea @JaneConan 你们可以用我提交的测试案例复现这个问题吗? 如果要修正,应该从哪个方向着手?