【问题标题】:Query dynamic parameters. NotSupportedException查询动态参数。不支持异常
【发布时间】:2020-12-28 08:27:52
【问题描述】:

我在使用 Dapper 查询参数时遇到了小问题。

我有:

  • WebApi 接收包含所有必需数据(实体名称、列、过滤器等)的请求。最深层次的过滤器有这样的结构(这个模型是由ctor从api模型构建的):
    public class QueryFilterItem
    {
        public string Name { get; }
        public string FieldName { get; }
        public object Value { get; }
        public ComparisonType ComparisonType { get; }
    }
  • 查询执行器,处理 api 调用
var arguments = new ExpandoObject();
// ...
arguments.TryAdd($"{filter.Name}Entity{filter.FieldName}", filter.Value);
// ... This part above is a part of another helper class, which is dynamically building filter query data

IEnumerable<dynamic> result;

using (var connection = DbConnectionFactory.CreateDbConnection())
{
    result = connection.Query(sqlQuery, arguments); // tried with wrapping into DynamicParameters
}

从那段代码中,我得到了这个异常:

System.NotSupportedException: The member MyFilterItemEntityId 
of type System.Text.Json.JsonElement cannot be used as a parameter value
   at Dapper.SqlMapper.LookupDbType(Type type, String name, Boolean demand, ITypeHandler& handler) in /_/Dapper/SqlMapper.cs:line 418
   at Dapper.DynamicParameters.AddParameters(IDbCommand command, Identity identity) in /_/Dapper/DynamicParameters.cs:line 232
   at Dapper.DynamicParameters.Dapper.SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, Identity identity) in /_/Dapper/DynamicParameters.cs:line 151
   at Dapper.SqlMapper.<>c__DisplayClass165_0.<GetCacheInfo>b__0(IDbCommand cmd, Object obj) in /_/Dapper/SqlMapper.cs:line 1714
   at Dapper.CommandDefinition.SetupCommand(IDbConnection cnn, Action`2 paramReader) in /_/Dapper/CommandDefinition.cs:line 129
   at Dapper.SqlMapper.<QueryImpl>d__140`1.MoveNext() in /_/Dapper/SqlMapper.cs:line 1080
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in /_/Dapper/SqlMapper.cs:line 725
   at Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in /_/Dapper/SqlMapper.cs:line 652
   at DappertStorageTest.Cqrs.SelectQueryHandler.GetByFilters(SelectQuery query)
   at DappertStorageTest.Cqrs.SelectQueryHandler.Handle(SelectQuery query)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
   at MAS.DappertStorageTest.Cqrs.Infrastructure.QueryProcessor.Execute[TResult](IQuery`1 query)
   at MAS.DapperStorageTest.Controllers.DataController.Select(SelectRequest selectRequest)
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<<InvokeActionMethodAsync>g__Logged|12_1>d.MoveNext()

参数值(不是异常的一部分):

sqlQuery: USE [DapperStorageTest];SELECT * FROM [Passenger] WHERE ([Id] = @MyFilterItemEntityId)

参数:{[MyFilterItemEntityId, ValueKind = String : "7d570abd-576d-425f-9d24-d84314d299ba"]}(原始)

有人可以帮我吗?

【问题讨论】:

  • 您是否正在尝试创建某种通用的“接受一个字符串和一个对象并运行一个小巧的查询并返回结果”的方法?详细说明您的用例?
  • @CaiusJard 是的。这是 Select 查询,它将在外部(从另一个服务 \ 或前端客户端)调用。案例很简单——提供对数据库的单一访问。客户端必须能够使用动态过滤器\过滤器组对其进行配置。比 EF Repository 有点复杂..
  • filter.Valuestring 还是 JsonElement
  • @xanatos filter.value 是对象。稍等一下,我将在帖子中提供更多信息
  • @bodynar 是和否... object x = "Hello" x 是string :-) ... 你能打印我们filter.Value.GetType()吗?

标签: c# json asp.net-web-api mapping


【解决方案1】:

感谢xanatos web api 模型 映射导致的异常。根据 api 模型过滤器值有 object 类型和 asp.net 核心映射字符串到 JsonElement。从object 切换到string 类型。

public class QueryFilterItem
    {
        public string Name { get; }
        public string FieldName { get; }
        public object Value { get; } // Here
        public ComparisonType ComparisonType { get; }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    相关资源
    最近更新 更多