C# 查询动态参数。冒号
我对使用简洁的查询参数有点小问题 我有:C# 查询动态参数。冒号,c#,json,asp.net-web-api,mapping,C#,Json,Asp.net Web Api,Mapping,我对使用简洁的查询参数有点小问题 我有: WebApi接收包含所有必需数据(实体名称、列、筛选器等)的请求。最深层的过滤器具有此结构(此模型由ctor根据api模型构建): 公共类查询过滤器项 { 公共字符串名称{get;} 公共字符串字段名{get;} 公共对象值{get;} 公共ComparisonType ComparisonType{get;} } 查询执行器,处理api调用 var arguments=newexpandoobject(); // ... arguments.
- WebApi接收包含所有必需数据(实体名称、列、筛选器等)的请求。最深层的过滤器具有此结构(此模型由ctor根据api模型构建):
公共类查询过滤器项
{
公共字符串名称{get;}
公共字符串字段名{get;}
公共对象值{get;}
公共ComparisonType ComparisonType{get;}
}
- 查询执行器,处理api调用
var arguments=newexpandoobject();
// ...
arguments.TryAdd($“{filter.Name}实体{filter.FieldName}”,filter.Value);
// ... 上面的这部分是另一个helper类的一部分,该类动态构建过滤器查询数据
可数结果;
使用(var connection=DbConnectionFactory.CreateDbConnection())
{
result=connection.Query(sqlQuery,arguments);//尝试包装为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()
System.NotSupportedException:成员MyFilterItemTityId
类型为System.Text.Json.JsonElement不能用作参数值
在/\uu/Dapper/SqlMapper.cs中的Dapper.SqlMapper.LookupDbType(类型类型、字符串名称、布尔需求、ITypeHandler和handler)处:第418行
在/\uu/Dapper/DynamicParameters.cs中的Dapper.DynamicParameters.AddParameters(IDbCommand,Identity Identity)处:第232行
在/\uu/Dapper/DynamicParameters.cs中的Dapper.DynamicParameters.Dapper.SqlMapper.IDynamicParameters.AddParameters(IDbCommand,Identity Identity)处:第151行
在/\u0/Dapper/SqlMapper.cs中的Dapper.SqlMapper.c_u显示Class165_0.b_u0(IDbCommand cmd,Object obj):第1714行
在/u/Dapper/CommandDefinition.cs中的Dapper.CommandDefinition.SetupCommand(IDbConnection cnn,Action`2 paramReader)处:第129行
在/u/Dapper/SqlMapper.cs中的Dapper.SqlMapper.d_u140`1.MoveNext()处:第1080行
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
在/\u/Dapper/SqlMapper.cs中的Dapper.SqlMapper.Query[T](IDbConnection cnn,String sql,Object param,IDbTransaction transaction,Boolean buffered,Nullable`1 commandTimeout,Nullable`1 commandType):第725行
在/u/Dapper/SqlMapper.cs:第652行中的Dapper.SqlMapper.Query(IDbConnection cnn,String sql,Object param,IDbTransaction transaction,Boolean buffered,Nullable`1 commandTimeout,Nullable`1 commandType)处
在DapperStorageTest.Cqrs.SelectQueryHandler.GetByFilters(SelectQuery查询)
在DappertStorageTest.Cqrs.SelectQueryHandler.Handle(SelectQuery查询)
在System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](调用站点,T0 arg0,T1 arg1)
在MAS.DappertStorageTest.Cqrs.Infrastructure.QueryProcessor.Execute[TResult](IQuery`1查询)
在MAS.DapperStorageTest.Controllers.DataController.Select(SelectRequest SelectRequest)
位于Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(对象目标,对象[]参数)
位于Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper映射器、ObjectMethodExecutor执行器、对象控制器、对象[]参数)
在Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.d.MoveNext()中
参数值(不属于异常的一部分):
sqlQuery:使用[DapperStorageTest];从[Passenger]中选择*,其中([Id]=@MyFilterItemTityId)
参数:{[MyFilterItemTityId,ValueKind=String:“7d570abd-576d-425f-9d24-d84314d299ba”}(原始)
有人能帮我吗?谢谢你
web api模型映射引起的异常。根据api模型,筛选器值具有对象
类型,asp.net核心将字符串映射到JsonElement
。从对象
切换到字符串
类型
公共类查询过滤器项
{
公共字符串名称{get;}
公共字符串字段名{get;}
公共对象值{get;}//此处
公共ComparisonType ComparisonType{get;}
}
您是否正在尝试创建某种常规的“获取字符串和对象并运行简洁的查询并返回结果”方法?更多地解释你的用例?@CaiusJard是的。这是Select查询,将在外部调用(从另一个服务\或前端客户端)。案例很简单-提供对数据库的uni访问。客户端必须能够配置动态筛选器\筛选器组。比EF Repository.稍微复杂一点。它是过滤器。Value
是字符串或JsonElement
?@xanatos过滤器。Value
是对象。请稍等,我将在中提供更多信息post@bodynar是和否object x=“Hello”
x是一个字符串
:-)。。。你能给我们打印一下filter.Value.GetType()
?