0

我需要从两个查询中创建一个新模型。我有一个Member实体和一个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; }
}
4

1 回答 1

1

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

这将返回一个 ...Model 对象的列表,仅适用于选定的成员(那些在 teamMembers 列表中):

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

并且此查询应将所有成员作为 ...Model 对象返回,其中 selected 属性是根据与上述相同的条件设置的:

    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();
于 2012-05-02T19:37:21.497 回答