Linq从ICollection <t>转换为List <t> </t> </t>

时间:2014-07-02 20:40:12

标签: c# linq entity-framework linq-to-entities icollection

我正在使用Code First Entity Framework。

我使用以下简单类:

public class Users
{
    public ICollection<Projects> Projects{get;set;}
}

public class Projects
{
    public ICollection<Users> Users{get;set;}
}

我正在使用linq进行数据检索。执行以下查询时:(请注意,lstProjectsList<Project>

var lstUsers = (from users in lstProjects
                where users.ProjectId == pId
                select users.Users).ToList();

我有一个List<Users>对象,想要用项目填充此列表。像,

var lstUsersToDisplay = new List<Users>();
lstUsersToDisplay = (List<Users>)lstUsers; //This can't be cast.

ICollection<T>转换为List<T>的方法是什么?

其次,我有List<Users>并希望将其转换为ICollection<Users>如何实现此目标?

编辑: 场景,更清楚的是 所有Projects都加载到lstProjects中,我们需要选择映射到特定项目的Users。这些用户也包含在Projects内作为集合。每个Project都有Users collection,如果我将lstProjects分解为:

lstProjects --> [0]-->//other Properties ICollection[Users]-->[0]//Contains User class Properties [1].... [1] ... same procedure

希望它能清除场景

4 个答案:

答案 0 :(得分:5)

如果您的查询真的这个:

var lstUsers = (from users in lstProjects
                where users.ProjectId == pId
                select users.Users).ToList();

那相当于:

List<ICollection<Users>> lstUsers = (from users in lstProjects
                                     where users.ProjectId == pId
                                     select users.Users).ToList();

如果您正在尝试从单个项目中获取使用列表,我会将其写为:

var lstUsers = lstProjects.Single(project => project.ProjectId == pId)
                          .Users
                          .ToList();

如果可能有多个具有相同ProjectId的项目,您希望展平用户。例如:

var lstUsers = lstProjects.Where(project => project.ProjectId == pId)
                          .SelectMany(project => project.Users)
                          .ToList();

或者在查询表达式语法中:

var lstUsers = (from project in lstProjects
                where project.ProjectId == pId
                from user in project.Users
                select user).ToList();

请注意我的范围变量名为project,因为它指的是项目,不是用户。命名很重要 - 注意它。我还会将ProjectsUsers类型重命名为ProjectUser,假设每个类型实际上只是代表一个实体。

答案 1 :(得分:0)

  

ICollection<T>转换为List<T>的方法是什么?

最通用的方法是使用ToList

lstUsersToDisplay = lstUsers.ToList();

但看起来你真的有一个List<ICollection<Users>>。 To&#34; flatten&#34;该列表使用SelectMany

lstUsersToDisplay = lstUsers.SelectMany(c => c).ToList();
  

我有List<Users>并希望将其转换为ICollection<Users>如何实现此目标?

List<Users> ICollection<Users> - 无需转换。

答案 2 :(得分:0)

lstUsers不是List<User>。它是List<ICollection<User>>。您将每个项目映射到用户的序列,而不是单个用户。要将集合集合展平为只使用SelectMany内部项目的集合,或者在查询语法中,您可以像这样写出您的查询:

var lstUsers = (from project in lstProjects
                where project.ProjectId == pId
                from user in project.Users
                select user).ToList();

现在 List<User>有一个lstUsers。您可以按原样分配给List<User>ICollection<User>

答案 3 :(得分:0)

using System.Linq; //include extension method OfType<> for ICollection
...
List<Projects> userList = lstUsers.OfType<Projects>().ToList();