是否可以在LINQ查询中拆分值并添加if条件? [英] Is it possible to split a value and add an if condition in a LINQ Query?
问题描述
我从以下JSON响应开始:
I am starting with the following JSON response:
{
"d": {
"RowData": [
{
"GenreId": 11,
"GenreName": "Musical",
"subjecturl": "subjecturl_123",
"logourl": "logourl_1"
},
{
"GenreId": 12,
"GenreName": "kids",
"subjecturl": "subjecturl_abc",
"logourl": "logourl_2"
},
{
"GenreId": 13,
"GenreName": "other",
"subjecturl": "subjecturl_123",
"logourl": "logourl_3"
},
{
"GenreId": 14,
"GenreName": "Musical",
"subjecturl": "subjecturl_abc",
"logourl": "logourl_4"
},
{
"GenreId": 15,
"GenreName": "Music",
"subjecturl": "subjecturl_123",
"logourl": "logourl_5"
},
{
"GenreId": 16,
"GenreName": "Faimaly",
"subjecturl": "subjecturl_abc",
"logourl": "logourl_6"
},
{
"GenreId": 17,
"GenreName": "other",
"subjecturl": "subjecturl_abc",
"logourl": "logourl_7"
},
{
"GenreId": 18,
"GenreName": "other",
"subjecturl": "subjecturl_123",
"logourl": "logourl_8"
},
{
"GenreId": 19,
"GenreName": "kids",
"subjecturl": "subjecturl_123",
"logourl": "logourl_9"
},
{
"GenreId": 20,
"GenreName": "Musical",
"subjecturl": "subjecturl_123",
"logourl": "logourl_10"
},
{
"GenreId": 21,
"GenreName": "other",
"subjecturl": "subjecturl_123",
"logourl": "logourl_11"
}
]
}
}
我的目标是将上述响应转换为新的响应,如下所示:
My goal is to transform the above response into a new response as shown below:
{
"rows": [
{
"title": "Musical",
"items": [
{
"hdsubjecturl": "logourl_123",
"hdlogourl": "logourl_1",
"subjecturlsplit": "1"
},
{
"hdsubjecturl": "subjecturl_abc",
"hdlogourl": "logourl_4",
"subjecturlsplit": "abc"
},
{
"hdsubjecturl": "logourl_123",
"hdlogourl": "logourl_10",
"subjecturlsplit": "10"
}
]
},
{
"title": "kids",
"items": [
{
"hdsubjecturl": "subjecturl_abc",
"hdlogourl": "logourl_2",
"subjecturlsplit": "abc"
},
{
"hdsubjecturl": "logourl_123",
"hdlogourl": "logourl_9",
"subjecturlsplit": "9"
}
]
},
{
"title": "Music",
"items": [
{
"hdsubjecturl": "logourl_123",
"hdlogourl": "logourl_5",
"subjecturlsplit": "5"
}
]
},
{
"title": "other",
"items": [
{
"hdsubjecturl": "logourl_123",
"hdlogourl": "logourl_3",
"subjecturlsplit": "3"
},
{
"hdsubjecturl": "subjecturl_abc",
"hdlogourl": "logourl_7",
"subjecturlsplit": "abc"
},
{
"hdsubjecturl": "logourl_123",
"hdlogourl": "logourl_8",
"subjecturlsplit": "8"
},
{
"hdsubjecturl": "logourl_123",
"hdlogourl": "logourl_11",
"subjecturlsplit": "11"
}
]
},
{
"title": "Faimaly",
"items": [
{
"hdsubjecturl": "subjecturl_abc",
"hdlogourl": "logourl_6",
"subjecturlsplit": "abc"
}
]
}
]
}
我尝试了以下LINQ查询以做出上述响应:
I tried the following the LINQ query for making the above response:
var data = json["d"]?["RowData"]
.GroupBy(x => x["GenreName"])
.ToDictionary(g => g.Key, g => g.ToList())
.Select(kvp => new
{
title = kvp.Key,
items = kvp.Value.Select(x => new { hdsubjecturl = x["subjecturl"], url = x["logourl"], subjecturlsplit = "" })
});
var result = JObject.FromObject(new { rows = data });
使用此查询,我做出了如下响应.
Using this query I made a response like below.
{
"rows": [
{
"title": "Musical",
"items": [
{
"hdsubjecturl": "subjecturl_123",
"hdlogourl": "logourl_1",
"subjecturlsplit": ""
},
{
"hdsubjecturl": "subjecturl_abc",
"hdlogourl": "logourl_4",
"subjecturlsplit": ""
},
{
"hdsubjecturl": "subjecturl_123",
"hdlogourl": "logourl_10",
"subjecturlsplit": ""
}
]
},
{
"title": "kids",
"items": [
{
"hdsubjecturl": "subjecturl_abc",
"hdlogourl": "logourl_2",
"subjecturlsplit": ""
},
{
"hdsubjecturl": "subjecturl_123",
"hdlogourl": "logourl_9",
"subjecturlsplit": ""
}
]
},
{
"title": "Music",
"items": [
{
"hdsubjecturl": "subjecturl_123",
"hdlogourl": "logourl_5",
"subjecturlsplit": ""
}
]
},
{
"title": "other",
"items": [
{
"hdsubjecturl": "subjecturl_123",
"hdlogourl": "logourl_3",
"subjecturlsplit": ""
},
{
"hdsubjecturl": "subjecturl_abc",
"hdlogourl": "logourl_7",
"subjecturlsplit": ""
},
{
"hdsubjecturl": "subjecturl_123",
"hdlogourl": "logourl_8",
"subjecturlsplit": ""
},
{
"hdsubjecturl": "subjecturl_123",
"hdlogourl": "logourl_11",
"subjecturlsplit": ""
}
]
},
{
"title": "Faimaly",
"items": [
{
"hdsubjecturl": "subjecturl_abc",
"hdlogourl": "logourl_6",
"subjecturlsplit": ""
}
]
}
]
}
请注意,每个项目的subjecturlsplit
为空.在这里,是否可以在此LINQ查询中添加条件逻辑?我想在下划线(_
)上拆分hdsubjecturl
值,并检查第二部分是否等于abc
.如果是,那么我想将subjecturlsplit
设置为hdsubjecturl
字段.否则,我想在下划线上拆分hdlogourl
值,并将subjecturlsplit
设置为该拆分的第二部分.还是有另一种方法可以做到这一点?
Notice that the subjecturlsplit
is empty for each item. Here, is it possible to add conditional logic in this LINQ query? I would like to split the hdsubjecturl
value on the underscore (_
) and check whether the second part is equal to abc
. If it is, then I want to set subjecturlsplit
to the hdsubjecturl
field as it is. Otherwise, I want to split the hdlogourl
value on the underscore and set the subjecturlsplit
to the second part of that split. Or is there another way to do that?
推荐答案
是的,您可以在lambda表达式中放置一个块体,因此可以在其中执行逻辑:
Yes, you can put a block body in a lambda expression, so you can do your logic there:
var data = json["d"]?["RowData"]
.GroupBy(x => x["GenreName"])
.ToDictionary(g => g.Key, g => g.ToList())
.Select(kvp => new
{
title = kvp.Key,
items = kvp.Value.Select(x =>
{
var hdsubjecturl = (string)x["subjecturl"];
var url = (string)x["logourl"];
var subjecturlsplit = hdsubjecturl.Split('_')[1] == "abc" ? "abc" : url.Split('_')[1];
return new { hdsubjecturl, url, subjecturlsplit };
})
});
提琴: https://dotnetfiddle.net/RH60VC
这篇关于是否可以在LINQ查询中拆分值并添加if条件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!