簡體   English   中英

具有多個相同類型但具有不同限制的列表屬性的類

[英]Class with multiple List Properties of same type but with different restrictions

這是我的問題:我有一個類,該類具有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-領導者屬性-應包括具有任何經驗的所有相關編程器(programmer.Experiente!= null或““);

編輯2:這是MyProjectDbContext聲明:

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

您是在談論EntityFramework(實體的Linq),對嗎? 如果是這樣,則Include()是Linq To Entities的一種方法,可在結果集中包含子關系。 我認為您應該將Where()放在Inlcude()之外。

該主題上,您將找到一些有關如何使用Include()方法的示例。

因此,我建議首先添加Include()以包括“成員”和“領導者”關系,然后應用您的Where-Statement(可以通過一個Where()完成)。

return db.Teams
    .Include("Team.Members")
    .Include("Team.Leaders")
    .Where(t => string.IsNullOrWhitespace(t.Members.Experience) ... )

對我來說不清楚的是,您在談論獲取包含領導者和成員的團隊列表時的標准和用例。 上面的示例可能會返回與Where()語句匹配的團隊列表。 您可以查看它,並在該循環中可以列出其成員和領導者(如果使用的話)。

替代方法是這樣的:

return db.Members
    .Where(m => string.IsNullOrWhitespace(m.Experience))
    .GroupBy(m => m.Team)

這會為您提供沒有經驗的成員列表,這些成員按團隊分組。 您可以在其成員上循環組(團隊)。 如果您只想讓每個團隊一次,則可以在末尾添加一個Distinct(m => m.Team)。

希望這可以幫助。 如果您需要一些更詳細的代碼示例,則有助於更好地了解您的要求。 因此,也許您可​​以對查詢的期望再說幾句話。

更新:

只需閱讀我們聽起來很有趣的編輯即可。 我認為您無法在一個Linq-To-Entities語句中完成全部操作。 就個人而言,我會在成員和領導者屬性的獲取器上執行此操作,這些屬性將執行自己的查詢(作為只讀屬性)。 為了獲得海量數據的性能,我什至可以使用數據庫本身的SQL視圖來實現。 但這在某種程度上取決於所使用的“成員”和“領導者”的上下文(頻繁出現等)。

更新2:

使用單個查詢獲取具有成員和領導者子列表的團隊表,我將對“程序員”進行查詢,並按“團隊”和“經驗”對它們進行分組。 然后,結果是其中包含程序員的組(有經驗/無經驗)的組(=團隊)列表。 然后可以使用三個嵌套的foreach-Statement構建最終表。 有關某些分組示例,請參見此處 (請參見示例“ GroupBy-嵌套”)。

每當您獲取實體時,它們都會存儲在上下文中-不管“選擇”它們的形式如何。這意味着您可以將團隊以及所有必要的相關實體獲取為匿名類型,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM