是否可以在LINQ查询中拆分值并添加if条件? [英] Is it possible to split a value and add an if condition in a LINQ Query?

查看:66
本文介绍了是否可以在LINQ查询中拆分值并添加if条件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从以下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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆