2012-05-02 25 views
0

2つのクエリから新しいモデルを作成する必要があります。私はそれらの両方がお互いへの参照を持つ、メンバーエンティティとMemberTeam実体を持っています。私が必要とするのは、すべてのメンバーののメンバーであり、そのメンバーが特定のチームに割り当てられているかどうかを知ることです。2つのLinqクエリをforeachループなしの単一選択に結合する

は、私は現在動作しますが、私には不格好と思われる次のコードを持っている、と私は誰かが(foreachのなし)のみのLINQ文を使用して、この組み合わせリストを作成するためのより良い方法があることを期待しています。基本的には、コードはすべてのメンバーのリストを取得し、チームに割り当てられたメンバーの別のリストを取得し、foreachループを使用してメンバーがチームに割り当てられているかどうかを確認します。

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

私はあなたを正しく理解している場合、完全にはわからない - しかし私は、これらはあなたが必要なクエリをかもしれないと思う:より良い私のモデルを理解するために必要な場合

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

、ここに私のエンティティがあります?

のみ(teamMembersリストにあるものを)選択したメンバーのための...モデルオブジェクトリストを返します。この1:

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ループよりも効率的であることを期待していません。

UPDATE:

[OK]を、私は意図を誤解 - しかし私はそれだけで1デシベルの呼び出しを行うために完璧な理にかなっているので、私はループ離れて何かを無視し、あなたがforeachのを取り除くしたいと思いました。
私はエンティティフレームワークにあまり慣れていませんが、メンバーが選択したチームにいるかどうかを評価するためにteamId値を使ってallMembersリストでのみ動作する、以下のlinq文で十分です。
問題が解決するかどうか教えてください。

+0

ジョアンナ、フィードバックいただきありがとうございます。あなたの2番目の方法は、私が探していたものでした。私は効率についてあなたのポイントを見ます。より洗練されているように見えますが、それでもデータベース(allMembersとteamMembers)に対して2つのクエリが必要です。私は単一の選択声明を期待していましたが、あなたの提案はまだきれいです。入力いただきありがとうございます。 – bigmac

+0

@bmccleary - 私はクエリを変更しましたが、今ははるかに簡単です。あなたが望むことをやっているようにも思われます - アップデート2を見てください。 –

関連する問題