1

ここに私の問題があります:同じクラスタイプの2つのリストプロパティを持つクラスがあります(ただし、入力方法に関していくつかの異なる制限があります)、次のようにしましょう:

public class Team 
{
    [Key]
    public int IDTeam { get; set; }

    public string TeamName { get; set; }

    public List<Programmer> Members { get; set; }

    public List<Programmer> Leaders { get; set; }

    public LoadLists(MyProjectDBContext db) 
    {
        this.Members = db.Programmers.Where(p => p.IDTeam = this.IDTeam 
                 && (p.Experience == "" || p.Experience == null)).ToList();

        this.Leaders = db.Programmers.Where(p => p.IDTeam = this.IDTeam 
                 && (p.Experience != null && p.Experience != "")).ToList();
    }
}

public class Programmer 
{
    [Key]
    public int IDProgrammer { get; set; }

    [ForeignKey("Team")]
    public int IDTeam { get; set; }
    public virtual Team Team { get; set; }

    public string Name { get; set; }

    public string Experience { get; set; }
}

ある時点で、メンバーとリーダーを含むチームのリストを取得する必要があります。このために、次のようなものを想定します。

return db.Teams
    .Include(m => m.Members.Where(p => p.Experience == "" || p.Experience == null)
    .Include(l => l.Leaders.Where(p => p.Experience != null && p.Experience != "")
    .OrderBy(t => t.TeamName)
    .ToList();

そしてもちろん、この場合、私はそれが間違っていると仮定します (まったく機能していないため)。それを達成する方法についてのアイデアはありますか?

編集: もう少し明確にするために、チーム クラスの 2 つのリスト プロパティは次のように入力する必要があります。

1 - メンバー属性 - 経験のない関連するすべてのプログラマーを含める必要があります (proggramer.Experience == null または "");

2 - Leaders 属性 - 関連するすべてのプログラマー (programmer.Experiente != null または "") を含める必要があります。

編集 2: MyProjectDbContext 宣言は次のとおりです。

public class MyProjectDBContext : DbContext
{
    public DbSet<Team> Teams { get; set; }
    public DbSet<Programmer> Programmers { get; set; }
}
4

2 に答える 2

0

エンティティをフェッチするたびに、エンティティが「選択」されている形式に関係なく、コンテキストに保存されます。つまり、次のように、必要なすべての関連エンティティとともにチームを匿名型にフェッチできます。

var teams =
    (from team in db.Teams
     select new {
         team,
         relatedProgrammers = team.Programmers.Where(
                                   [query that gets all leaders OR members])
     }).ToList().Select(x => x.team);

relatedProgrammersここでフィールドを破棄しているように見えますが、それらのProgrammerエンティティはまだメモリ内にあります。したがって、これを実行すると:

foreach (var team in teams) team.LoadLists(db);

...データベースに再度クエリを実行せずに、すでに取得されたプログラマーからリストを作成します (db上記と同じコンテキスト インスタンスであると仮定します)。

注:私はこれを自分でテストしていません。これは、この回答に示されている同様の手法に基づいています。

編集- 実際には、「リーダー」と「メンバー」はチームに関連付けられているすべてのTeams.Include(t => t.Programmers)プログラマーをカバーしているように見えるので、単に実行できるはずですLoadLists

于 2013-09-04T12:42:41.613 に答える