Not able to select values from right list using LINQ join

Viewed 67

I have two list list_1 and list_2 mentioned below respectively.

List 1:

[
    {
        "Id": "O1",
        "VId": "V2"
    },
    {
        "Id": "O2",
        "VId": "V2"
    },
    {
        "Id": "O3",
        "VId": "V2"
    }
]

List 2:

[
    {
        "Id": "O1",
        "VId": "V1"
    },
    {
        "Id": "O3",
        "VId": "V1"
    }
]

I am joining these two list using the query below.

var query = from obj_1 in list_1
join obj_2 in list_2
on obj_1.Id equals obj_2.Id into objCombined
from combinedObj in objCombined.DefaultIfEmpty()
select new Info {Id = obj_1.Id, S_VId = obj_1.VId, T_VId = combinedObj?.VId ?? null};

The result I get is this.

[
    {
        "Id": "O1",
        "S_VId": "V2",
        "T_VId": "V2" // want value as V1 here
    },
    {
        "Id": "O2",
        "S_VId": "V2",
        "T_VId": null // This is correct
    },
    {
        "Id": "O3",
        "VId": "V2",
        "T_VId": "V2" // want value as V1 here
    }
]

combinedObj that is getting populated is from list_1, that's why value I get in my output for T_VId is V2, I want the value of T_VId top be taken from list_2 and be V1.

How should I write the query to achieve this?

1 Answers

Here's a working sample:

var distinctIds = list1.Concat(list2).Select(x => x.Id).Distinct();
var result = distinctIds.Select(x => new Info()
{
    Id = x,
    S_VId = list1.FirstOrDefault(y => y.Id == x)?.VId,
    T_VId = list2.FirstOrDefault(y => y.Id == x)?.VId
});
Related