【问题标题】:Not able to select values from right list using LINQ join [closed]无法使用 LINQ 连接从右侧列表中选择值 [关闭]
【发布时间】:2020-03-13 08:33:23
【问题描述】:

我有两个列表list_1list_2 分别在下面提到。

清单 1:

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

清单 2:

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

我正在使用下面的查询加入这两个列表。

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};

我得到的结果是这样的。

[
    {
        "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 来自list_1,这就是为什么我在T_VId 的输出中得到的值是V2,我希望T_VId top 的值取自list_2 并成为V1。

我应该如何编写查询来实现这一点?

【问题讨论】:

  • 您可以添加一个您想要的退出示例吗?
  • @Iria : T_VId 属性应该具有 list_2 的 Vid 属性的值。即V1
  • 不出所料,我无法重现此问题 (example),因此我投票结束。
  • arg,变量名不连贯。

标签: c# linq join


【解决方案1】:

这是一个工作示例:

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
});

【讨论】:

  • 此代码不等同于 OP 的代码,OP 的代码有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多