linq联合合并子列表

linq联合合并子列表,linq,unions,Linq,Unions,给出如下对象列表: Instance - InstanceID Version - VersionID - List<Instance> Instances Activity - ActivityID - List<Version> Versions 只是不知道如何到达实例级别 (from activity in activities select new { activity.ActivityID, Instances =

给出如下对象列表:

Instance
 - InstanceID

Version
 - VersionID
 - List<Instance> Instances

Activity
 - ActivityID 
 - List<Version> Versions
只是不知道如何到达实例级别

(from activity in activities
 select new { activity.ActivityID,
              Instances = activity.ActivityVersions.SelectMany(v => v.ActivityInstances).AsEnumerable() });

您可以使用
SelectMany
方法展平子列表:

var result = activities.Select(a => new
{
    a.ActivityId, 
    Instances = a.Versions.SelectMany(v => v.Instances)
                          .GroupBy(i => i.InstanceID)
                          .Select(grp => grp.First())
                          .ToList()
});
您可以使用自定义的
IEqualityComparer
,使用
不同的
重新调整GroupBy逻辑的速度:

var result=activities。选择(a=>new
{
a、 活动ID,
Instances=a.Versions.SelectMany(v=>v.Instances)
.Distinct(新InstanceComparer())
托利斯先生()
});
类实例比较程序:IEqualityComparer
{
公共布尔等于(实例x、实例y)
{
返回x.InstanceID==y.InstanceID;
}
public int GetHashCode(实例obj)
{
返回obj.InstanceID.GetHashCode();
}
}

我没有做过空检查,但它们很琐碎。当然,这是假设这是LINQ to Object,因为没有其他标签表明这一点。

您必须展示您的尝试,我们将尽力帮助您解决任何问题。不是我需要密码,给我密码!网站…谢谢-刚刚发布了获得它。我会给你一个积分:)
(from activity in activities
 select new { activity.ActivityID,
              Instances = activity.ActivityVersions.SelectMany(v => v.ActivityInstances).AsEnumerable() });
var result = activities.Select(a => new
{
    a.ActivityId, 
    Instances = a.Versions.SelectMany(v => v.Instances)
                          .GroupBy(i => i.InstanceID)
                          .Select(grp => grp.First())
                          .ToList()
});
var result = activities.Select(a => new
{
    a.ActivityId, 
    Instances = a.Versions.SelectMany(v => v.Instances)
                          .Distinct(new InstanceComparer())
                          .ToList()
});

class InstanceComparer : IEqualityComparer<Instance>
{

    public bool Equals(Instance x, Instance y)
    {
        return x.InstanceID == y.InstanceID;
    }

    public int GetHashCode(Instance obj)
    {
        return obj.InstanceID.GetHashCode();
    }
}