首页 > 解决方案 > 如何使用 LINQ 从似乎存储在字符串中的 JObjects 数组中访问特定值

问题描述

我在 C# 中进行数据库调用,看起来像这样:

public JArray GetEmployeeInfo(string search_text)
{
    var search = search_text.Split(' ');

    var dataObject = _db.Employee
        .Where(x => x.Usage.Equals("basic") &&
                    search.All(s => x.EmployeeName.Contains(s) || 
                                    x.EmployeeEmailAddress.Contains(s) || 
                                    x.EmployeeId.Contains(s)))
        .Select(x => new
        {
            x.EmployeeId,
            x.EmployeeName,
            x.EmployeeEmailAddress,
            x.EmployeeDepartmentName,
            x.UsageTags
        });

    return JArray.FromObject(dataObject);
}

哪个工作正常。问题在于返回的数据的格式。它看起来像这样:

{
  "EmployeeId": "000012345",
  "EmployeeName": "Firstname Lastname",
  "EmployeeEmailAddress": "flastname1@website.com",
  "EmployeeDepartmentName": "Accounting",
  "EmployeeType": "Staff",
  "UsageTags": "[{\"seqNo\":1,\"Tag\":\"CurrentEmpl:Accountant\"},{\"seqNo\":2,\"Tag\":\"CurrentEmpl:Manager\"},{\"seqNo\":3,\"Tag\":\"Intern:Attended\"}]"
}

我需要的是UsageTags一个值数组Tag,如下所示:

{
  "EmployeeId": "000012345",
  "EmployeeName": "Firstname Lastname",
  "EmployeeEmailAddress": "flastname1@website.com",
  "EmployeeDepartmentName": "Accounting",
  "EmployeeType": "Staff",
  "UsageTags": ["CurrentEmpl:Accountant", "CurrentEmpl:Manager", "Intern:Attended"]
}

现在,我正在用 JavaScript 格式化它,但如果我能写出一个在服务器端执行它的 LINQ 语句会好得多。我今天浪费了大部分时间尝试从这里开始的不同解决方案,以及谷歌和我的旧 C# Cookbook,但似乎没有任何效果。

任何人都有一个解决方案,可以以某种方式将 解析UsageTags为 的数组JObjects,然后提取所有Tag键的值并将值扔到数组中?因为,我要疯狂地用头撞这个。

标签: c#linqjson.net

解决方案


它看起来像是UsageTags一个已经包含 JSON 的字符串,因此您需要在每个项目中对其进行反序列化,以便提取标签名称。

尝试这样的事情:

public JArray GetEmployeeInfo(string search_text)
{
    var search = search_text.Split(' ');

    var dataObject = _db.Employee
        .Where(x => x.Usage.Equals("basic") && 
                    search.All(s => x.EmployeeName.Contains(s) || 
                                    x.EmployeeEmailAddress.Contains(s) || 
                                    x.EmployeeId.Contains(s)))
        .Select(x => new
        {
            x.EmployeeId,
            x.EmployeeName,
            x.EmployeeEmailAddress,
            x.EmployeeDepartmentName,
            x.UsageTags
        })
        .ToList();    // materialize the database query

    var array = new JArray(
        dataObject.Select(o =>
        {
            var jo = JObject.FromObject(o);
            // parse and transform the UsageTags
            jo["UsageTags"] = new JArray(
                JArray.Parse((string)jo["UsageTags"])
                      .Select(jt => jt["Tag"])
            );
            return jo;
        })
    );

    return array;
}

在这里工作演示:https ://dotnetfiddle.net/nbHbkZ


推荐阅读