【问题标题】:Select from multiple lists从多个列表中选择
【发布时间】:2021-03-19 19:38:04
【问题描述】:

我有以下 linq 查询:

    var identities = message.Events
        .Where(x => x.EventType == eventType)
        .Where(x => x.Roles?.Any(y => y.RoleId == 42) == true)
        .SelectMany(x => x.Roles, (parent, child) =>
            new
            {
                parent.Id,
                child.CustomerName,
                child.CustomerNumber,
                child.RegionId

            })
        .Select(x =>
            new AuditFirmEmployeeCrud(x.CustomerName, x.CustomerNumber.Value, x.RegionId, x.GlobalId));

在事件列表中,我还有另一个列表 IEnumerable,我也想从中获取数据:

  public class MetaData
  {
    string Key { get; set; }

    string Source { get; set; }

    string Value { get; set; }
  }

但我不知道如何从多个列表中进行选择?谁能帮助我?我想尝试以某种方式将 x.Roles 和 x.MetaData 上的 SelectMany 结合起来。

这里是列表:

public class EventList
{
    Event[] Events {get; set;}
}

public class Event
{
    EventType Type {get; set;}
    Guid Id {get; set;}
    IEnumerable<Accounts>? Accounts { get; set; }

    IEnumerable<MetaData>? Metadata { get; set; } // This i want to combine as well, and get the value of the Key and Value property

    IEnumerable<Roles>? Roles { get; set; } // This I already got
}

所以基本上,我想将这个重写到 Linq:

    foreach (var eventRow in message.Events)
    {
        if (eventRow.EventType == someEvent)
        {
            var Id = eventRow.GlobalId;
            var customerNumber = eventRow.Roles.Where(x => x.RoleId == 42).Select(x => x.CustomerNumber).FirstOrDefault();
            var regionId = eventRow.Roles.Select(x => x.RegionId).FirstOrDefault();
            var customerName = eventRow.Metadata.Select(x => x.Key + " " + x.Value).FirstOrDefault();

            var crudObj = new AuditFirmEmployeeCrud(customerName, customerNumber.Value, regionId, Id);
        }
    }

【问题讨论】:

  • @ThomasWeller:是吗?在我的问题中查看 MetaData 类是如何定义的。是MetaData-class中的三个属性,我想获取Value属性和Key属性的值。
  • 显然我不明白。我出去了
  • @ThomasWeller:再次检查我更新的问题。 :)
  • .FirstOrDefault() - 这使它只是一个值而不是一个列表
  • @ThomasWeller 我放弃了。我出去了。

标签: c# linq .net-core


【解决方案1】:

不确定我是否理解问题所在。您的问题令人困惑,因为您问题开头的 LINQ 查询与您在问题末尾的 foreach 循环中所做的事情几乎没有关系。

您真的只想将 foreach 循环转换为 LINQ 吗?如果是这样,那就很简单了:

var identities = message.Events
    .Where(eventRow => eventRow.EventType == someEvent)
    .Select(eventRow => new
    {
        Id = eventRow.GlobalId,
        CustomerNumber = eventRow.Roles
            .Where(x => x.RoleId == 42)
            .Select(x => x.CustomerNumber)
            .FirstOrDefault(),
        RegionId = eventRow.Roles
            .Select(x => x.RegionId)
            .FirstOrDefault(),
        CustomerName = eventRow.Metadata
            .Select(x => x.Key + " " + x.Value)
            .FirstOrDefault()
    })
    .Select(x => new AuditFirmEmployeeCrud(x.CustomerName, x.CustomerNumber.Value, x.RegionId, x.Id))
    .ToArray();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2020-07-04
    • 2012-08-20
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多