【发布时间】:2020-09-08 15:04:37
【问题描述】:
我可以通过在邮递员帖子(api 调用)中传递“名称”:“测试”来进行查询。 但是当我尝试在邮递员帖子中传递“data.Status”:“success”时......当我使用嵌套的json数据时,我无法过滤数据。 能否请您告诉我一种查询嵌套 json 数据的方法?
预期结果: 我应该从 cosmos db 中获取第二项,因为我正在过滤“data.Status”:“success”
Cosmos 数据库数据: 第一项:
{
"id": "fe5",
"name": "Test",
"clientId": 50000,
"data": {
"Id": "3D",
"Status": "success1"
}
}
第二项:
{
"id": "fe",
"name": "Test1",
"clientId": 50000,
"data": {
"Id": "3DA",
"Status": "success"
}
}
模型.cs:
public class Job
{
public Guid id { get; set; }
public string Name { get; set; }
public int? ClientId { get; set; }
public JObject Data { get; set; }
}
Filter query:
public async Task<List<Models.Job>> GetJobsByFilter(Dictionary<string, string> filters)
{
var allJobsQueryable = _jobsRepo.GetAllJobs();
var jobModelConversions = GetJobModelConversionExpressions();
foreach (var key in filters.Keys)
{
var paramExpr = Expression.Parameter(typeof(Models.Job), key);
var keyPropExpr = Expression.Property(paramExpr, key);---------------- problem is here: unable to get the model property for json nested data(data.success ) is failing
if (!jobModelConversions.ContainsKey(keyPropExpr.Type))
throw new Exception("Unknown type : " + keyPropExpr.Type.ToString());
var typeDelegate = jobModelConversions[keyPropExpr.Type];
var constantExp = typeDelegate(filters[key]);
var eqExpr = Expression.Equal(keyPropExpr, Expression.Convert(Expression.Constant(constantExp), keyPropExpr.Type));
var condExpr = Expression.Lambda<Func<Models.Job, bool>>(eqExpr, paramExpr);
allJobsQueryable = (IOrderedQueryable<Models.Job>) allJobsQueryable.Where(condExpr);
}
return allJobsQueryable.ToList();
}
public Dictionary<Type, Func<string, object>> GetJobModelConversionExpressions()
{
var lookup = new Dictionary<Type, Func<string, object>>();
lookup.Add(typeof(string), x => { return x; });
lookup.Add(typeof(int), x => { return int.Parse(x); });
lookup.Add(typeof(int?), x => { return int.Parse(x); });
return lookup;
}
【问题讨论】:
标签: .net api linq asp.net-core