【问题标题】:How to query nested json data in linq?如何在linq中查询嵌套的json数据?
【发布时间】: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


    【解决方案1】:

    将 json 转换为一个对象,然后使用 SelectTokens 得到你想要的。

    SelectMany(tr => tr.SelectTokens("data.status", false)).Select(t => t.Value<string>()).ToArray();
    

    只需设置您的数组变量以接收该结果,然后您当然可以得到第一个、第二个,无论您想要什么。

    【讨论】:

    • 你可以标记你自己的答案来结束这个问题。:)
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多