c# - 如何使用 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
键的值并将值扔到数组中?因为,我要疯狂地用头撞这个。
解决方案
它看起来像是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
推荐阅读
- javascript - 如何在反应中的两个子组件之间传递数据
- amazon-web-services - EC2:连接服务器失败
- python - 如何使用 powershell/Windows 终端在 vscode 中调试(Python)程序?
- azure - 是否以编程方式为 azure 中的 VM 制定更新 agnet 准备情况?
- python-3.x - “next”的重载变体不匹配参数类型 List[Scene]
- websocket - 币安期货 ACCOUNT_UPDATE 流交易通过 websocket 问题?
- swift - 如何在 SwiftUI 应用程序生命周期中将 statusBar 传递给 popover 中的 contentView?
- python - 迭代列表并评估元素时未获得预期结果
- excel-formula - Limiting row returns in table column search
- jenkins-pipeline - 我们可以在 jenkinsfile 中将 github webhook 添加为 config as code 吗?