Как использовать LINQ для доступа к определенному значению массива объектов JObject, который, кажется, хранится в строке - PullRequest
1 голос
/ 29 октября 2019

Я делаю вызов базы данных в 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, который делает это на стороне сервера. Я потратил большую часть сегодняшнего дня, пытаясь найти здесь разные решения, а также Google и мою старую кулинарную книгу C #, но, похоже, ничего не поделаешь.

У кого-нибудь есть решение, которое каким-то образом разбирает UsageTags в массивJObjects, затем вытащить значения всех клавиш Tag и выбросить значения в массив? Потому что я схожу с ума, стуча головой по этому.

1 Ответ

1 голос
/ 29 октября 2019

Похоже, 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...