0

2つのクエリから新しいモデルを作成する必要があります。私には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

私があなたを正しく理解したかどうかは完全にはわかりませんが、これらはあなたが必要とするクエリかもしれないと思いますか?

これは、選択されたメンバー(teamMembersリストにあるメンバー)のみの...Modelオブジェクトのリストを返します。

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

そして、このクエリはすべてのメンバーを... Modelオブジェクトとして返す必要があります。ここで、選択されたプロパティは上記と同じ条件に基づいて設定されます。

    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呼び出しを1回だけ行うのは理にかなっています。
私はエンティティフレームワークにあまり精通していませんが、次のlinqステートメントで十分だと思います-メンバーが選択したチームに属しているかどうかを評価するためにteamId値を使用してallMembersリストでのみ動作します。
それで問題が解決するかどうか教えてください。

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 に答える