如何返回每个结果的内部集合

时间:2018-02-08 21:38:17

标签: c# entity-framework

我有一个返回所有用户的查询:

public class User
{
   public int Id {get;set;}
   public virtual List<Location> Locations {get;set;}
}

现在我有一个用户列表,但我只想为每个用户返回位置,我该怎么做?

var users = repository.FindAll();

因此,对于每个用户,我想返回Location集合。

2 个答案:

答案 0 :(得分:3)

我不完全确定您的问题,但实体框架与您的存储库相结合应该返回您的对象的活动集合。如果语法确实生成了一个有效的对象,那么我假设你有以下数据。

public class User
{
     public int Id { get; set; }
     public string Name { get; set; }
     public List<Location> Locations { get; set; }
}

你可以这样做:

var locations = users.GetAllUsers()
                     .Select(user => user.Locations)
                     .SelectMany(location => location)
                     .Distinct();

因此,选择位置对象,然后将其展平以获得所需数据,然后选择不同以删除重复项。因此,您将收到与您的用户相关联的所有位置。你可以混合和匹配Linq来完成这一系列不同的方式。我可能有语法或反转SelectSelectMany,因为我一直被打断但这至少可以帮助你。

答案 1 :(得分:2)

首先,您应该提取所有位置,然后将它合并到单个列表中

var mergedList = MergeLists(users.Select(x => x.Locations).ToList());

MergeLists看起来像这样

    List<Location> MergeLists(List<List<Location>> listsOfLists)
    {
        List<Location> mergedList = new List<Location>();
        foreach (List<Location> listLocation in listsOfLists)
        {
            mergedList.AddRange(listLocation);
        }
        return mergedList;
    }

EDIT。 更优雅的解决方案

users.Select(x => x.Locations).SelectMany(x => x).ToList();