在没有foreach循环的情况下将两个Linq查询连接到单个选择中

时间:2012-05-02 19:16:05

标签: linq entity-framework

我需要从两个查询中创建一个新模型。我有会员实体和 MemberTeam 实体,两者都互相引用。我需要的是所有成员列表,并知道该成员是否已分配给特定团队。

我目前有以下代码可行,但对我来说似乎很笨,我希望有人有一个更好的方法来创建这个组合列表只使用Linq语句(没有foreach)。基本上,代码获取所有成员的列表,获取分配给团队的另一个成员列表,然后使用foreach循环查看该成员是否已分配给团队。

  int teamId = 1;
  var model = new SelectedMemberListModel();
  List<Member> allMembers = _unitOfWork.RepositoryFor<Member>().All().ToList();
  List<Member> teamMembers = _unitOfWork.RepositoryFor<MemberTeam>().AllIncluding(x => x.Members).Single(x => x.Id == teamId).Members.ToList();
  List<SelectedMemberModel> membersWithTeamSelected = new List<SelectedMemberModel>();
  foreach (var member in allMembers)
  {
    SelectedMemberModel selectedMemberModel = new SelectedMemberModel();
    selectedMemberModel.FirstName = member.FirstName;
    selectedMemberModel.LastName = member.LastName;
    if(teamMembers.Contains(member))
    {
      selectedMemberModel.Selected = true;
    }
    membersWithTeamSelected.Add(selectedMemberModel);
  }

如果需要更好地理解我的模型,这是我的实体:

public class Member
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public int TeamId { get; set; }
  public virtual MemberTeam Team { get; set; }
  //... Other properties here...
}

public class MemberTeam
{
  public int Id { get; set; }
  public string Name { get; set; }
  public ICollection<Member> Members { get; set; }
}

public class SelectedMemberModel
{
  public int MemberId { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public bool Selected { get; set; }
}

1 个答案:

答案 0 :(得分:1)

我不完全确定我是否理解正确 - 但我认为这些可能是您需要的查询?

这个将返回一个列表...模型对象仅适用于选定的成员(teamMembers列表中的成员):

var assignedOnly = allMembers
                     .Where(m => teamMembers.Contains(m))
                     .Select(m => new SelectedMemberModel() { 
                         FirstName = m.FirstName, LastName = m.LastName, 
                         Selected = true, MemberId = m.Id});

此查询应将所有成员返回为...模型对象,其中所选属性的设置基于与上述相同的条件:

    var allToModel = from m in allMembers
                     let selected = teamMembers.Contains(m)
                     select new SelectedMemberModel() { 
                       FirstName = m.FirstName, LastName = m.LastName, 
                       Selected = selected, MemberId = m.Id };

无论如何,我不希望这比foreach循环更有效。

<强>更新

好吧,我误解了意图 - 我以为你想摆脱foreach所以我忽略了循环之外的任何东西,但是只做一次db调用是完全合理的。
我对实体框架并不太熟悉,但我认为以下linq语句就足够了 - 它只在allMembers列表上运行,使用teamId值来评估成员是否在所选团队中。
如果能解决您的问题,请告诉我。

var selectedMemberModelList = allMembers
                                 .Select(m => new SelectedMemberModel() {
                                    FirstName = m.FirstName, LastName = m.LastName,
                                    MemberId = m.Id, Selected = m.Id == teamId})
                                 .ToList();