Search code examples
c#asp.netasp.net-mvclinqasp.net-core

Fetch the Name based diff version for same Service and Function


Here is my Json object .

[
 {
  "Id": 1,
  "Name": "Asset A",
  "Version": 1,
  "Function": "Song",
  "Service": "Song"
 },
 {
  "Id": 2,
  "Name": "Asse B",
  "Version": 1,
  "Function": "IndustryX",
  "Service": "IndustryX"
 },
 {
  "Id": 3,
  "Name": "Asse C",
  "Version": 1,
  "Function": "Strategy",
  "Service": "IndustryX"
 },
 {
  "Id": 4,
  "Name": "Asse D",
  "Version": 1,
  "Function": "Strategy",
  "Service": "IndustryX"
 },
 {
  "Id": 5,
  "Name": "Asse D",
  "Version": 1,
  "Function": "Cross Function",
  "Service": "IndustryX"
 },
 {
  "Id": 6,
  "Name": "Asse E",
  "Version": 1,
  "Function": "Cross Function",
  "Service": "IndustryX"
 },
 {
  "Id": 7,
  "Name": "Asse F",
  "Version": 1,
  "Function": "Cross Function",
  "Service": "Song"
 },
 {
  "Id": 8,
  "Name": "Asse G",
  "Version": 1,
  "Function": "Cross Function",
  "Service": "Song"
 },
 {
  "Id": 9,
  "Name": "Asse G",
  "Version": 1,
  "Function": "Strategy",
  "Service": "Song"
 },
 {
  "Id": 10,
  "Name": "Asse H",
  "Version": 1,
  "Function": "Strategy",
  "Service": "Song"
 },
 {
  "Id": 11,
  "Name": "Asse A",
  "Version": 2,
  "Function": "Strategy",
  "Service": "Song"
 },
 {
  "Id": 12,
  "Name": "Asse A",
  "Version": 1,
  "Function": "Cross Function",
  "Service": "Song"
 }
]

select Name and Version when Service is 'IndustrYx' and Function is neither IndustryX nor Cross Function for that AssetVersion.

select Name and Version when Service is 'Song' and Function is neither Song nor Cross Function for that AssetVersion.

Expected Output : 3,10 ,11 record should come.

Here Asset D with version 1 has 2 record, if either 'Cross Function' or 'IndusryX' present for that Version and Name, should not appear in list

Tried but did not work


Solution

  • You can refer my sample code below, here is my test result.

    enter image description here

    public async Task<IActionResult> Test()
    {
        var assets = new List<Request>
        {
            new Request { Id = 1, Name = "Asset A", Version = 1, Function = "Song", Service = "Song" },
            new Request { Id = 2, Name = "Asse B", Version = 1, Function = "IndustryX", Service = "IndustryX" },
            new Request { Id = 3, Name = "Asse C", Version = 1, Function = "Strategy", Service = "IndustryX" },
            new Request { Id = 4, Name = "Asse D", Version = 1, Function = "Strategy", Service = "IndustryX" },
            new Request { Id = 5, Name = "Asse D", Version = 1, Function = "Cross Function", Service = "IndustryX" },
            new Request { Id = 6, Name = "Asse E", Version = 1, Function = "Cross Function", Service = "IndustryX" },
            new Request { Id = 7, Name = "Asse F", Version = 1, Function = "Cross Function", Service = "Song" },
            new Request { Id = 8, Name = "Asse G", Version = 1, Function = "Cross Function", Service = "Song" },
            new Request { Id = 9, Name = "Asse G", Version = 1, Function = "Strategy", Service = "Song" },
            new Request { Id = 10, Name = "Asse H", Version = 1, Function = "Strategy", Service = "Song" },
            new Request { Id = 11, Name = "Asse A", Version = 2, Function = "Strategy", Service = "Song" },
            new Request { Id = 12, Name = "Asse A", Version = 1, Function = "Cross Function", Service = "Song" }
        };
    
        var filteredAssets = assets
            .GroupBy(a => new { a.Name, a.Version })
            .Where(g => !g.Any(a => a.Function == "IndustryX" || a.Function == "Cross Function"))
            .SelectMany(g => g)
            .Where(a =>
                (a.Service.Equals("IndustryX", StringComparison.OrdinalIgnoreCase) && a.Function != "IndustryX" && a.Function != "Cross Function") ||
                (a.Service.Equals("Song", StringComparison.OrdinalIgnoreCase) && a.Function != "Song" && a.Function != "Cross Function"))
            .ToList();
    
    
        return Ok(filteredAssets);
    }