将两个Linq查询连接到一个选择中,而不使用foreach循环

将两个Linq查询连接到一个选择中,而不使用foreach循环,linq,entity-framework,Linq,Entity Framework,我需要从两个查询中创建一个新模型。我有一个成员实体和一个成员团队实体,两者都有相互的引用。我需要的是一份所有成员的列表,并知道该成员是否被分配到给定的团队 我目前有以下代码,但对我来说似乎很笨拙,我希望有人有更好的方法来创建这个组合列表,只使用Linq语句(不使用foreach)。基本上,代码获取所有成员的列表,获取分配给团队的另一个成员列表,然后使用foreach循环查看该成员是否分配给团队 int teamId = 1; var model = new SelectedMemberL

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

我目前有以下代码,但对我来说似乎很笨拙,我希望有人有更好的方法来创建这个组合列表,只使用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);
  }
intteamid=1;
var model=新建SelectedMemberListModel();
列出所有成员=_unitOfWork.RepositoryFor().All().ToList();
List teamMembers=\u unitOfWork.RepositoryFor().AllIncluding(x=>x.Members).Single(x=>x.Id==teamId.Members.ToList();
列表成员SwithTeamSelected=新建列表();
foreach(所有成员中的var成员)
{
SelectedMemberModel SelectedMemberModel=新建SelectedMemberModel();
selectedMemberModel.FirstName=member.FirstName;
selectedMemberModel.LastName=member.LastName;
if(团队成员.包含(成员))
{
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; }
}
公共类成员
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
public int TeamId{get;set;}
公共虚拟成员团队{get;set;}
//…这里的其他属性。。。
}
公共班级成员团队
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection成员{get;set;}
}
公共类选择成员模型
{
public int MemberId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
已选择公共布尔值{get;set;}
}

我不完全确定我是否正确理解了您的意思-但我想这些可能是您需要的查询

此操作将仅返回选定成员(团队成员列表中的成员)的…模型对象列表:

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

    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();

乔安娜,谢谢你的反馈。你的第二种方法就是我想要的。不过,我明白你关于效率的观点。它看起来更干净,但仍然需要对数据库进行两次查询(针对allMembers和teamMembers)。我希望能有一份选择声明,但你的建议还是比较干净的。谢谢您的输入。@bmccleary-我已经更改了查询,现在看起来简单多了。它似乎也在做你想做的事情-见更新2。
var selectedMemberModelList = allMembers
                                 .Select(m => new SelectedMemberModel() {
                                    FirstName = m.FirstName, LastName = m.LastName,
                                    MemberId = m.Id, Selected = m.Id == teamId})
                                 .ToList();