簡體   English   中英

EF代碼從多對多表的第一個返回記錄

[英]EF Code First- Return Records from Many to Many Table

我正在嘗試使用實體框架和linq統一獲取m:m表中的所有記錄。

數據模型:

public partial class Group
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid GroupId { get; set; }

    [StringLength(100)]
    public string Name { get; set; }

    public virtual ICollection<User> Users { get; set; }

}

public partial class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserId { get; set; } = new Guid();

    [StringLength(100)]
    public string FirstName { get; set; }

    [StringLength(100)]
    public string LastName { get; set; }

    [StringLength(255)]
    public string DisplayName { get; set; }


    public virtual ICollection<Group> Groups { get; set; }

}

這是SQL中的查詢,該查詢會拉回我要查找的數據集:

select g.GroupId, g.[Name], u.DisplayName, u.UserId 
from [Group] g, [User] u, [GroupUsers] gu
where g.GroupId = gu.Group_GroupId
and gu.User_UserId = u.UserId
order by g.[Name]

這是我在Linq中嘗試的方法,但出現了自引用循環錯誤:

using (RequestContext ctx = new RequestContext())
{
     return ctx.Groups.SelectMany(x => x.Users).Include(x => x.Groups).ToList();
}

這似乎應該相對容易一些,但是我發現Entity Framework中的m:m可能有點棘手。 任何幫助,將不勝感激。

我很高興您將多對多定義為兩個虛擬集合,而沒有指定連接表!

您確實意識到,如果不獲取“與他們的用戶組成的組”,而是查詢組和用戶的左外部連接(您稱其為扁平形式),則組屬性將針對每個對象重復一遍又一遍。用戶?

但是,這是您的決定,並且要由您說服項目負責人,最好是將相同的組屬性轉移一百次,而不是僅轉移一次。

您是對的,對於左外部SelectMany ,您需要執行SelectMany 我不確定為什么您決定使用Include而不是Select

查詢數據時,請始終使用Select ,並僅選擇您實際計划使用的屬性。 僅在計划更新獲取的包含數據時才使用Include

在一對多關系中,這樣做的原因特別有意義。 如果您獲取“學校及其學生”,並且ID為4的學校有1000名學生,那么您知道該學校的每個學生都將擁有一個值為4的外鍵。將這個值4轉移1000次是很浪費的!

Enumerable.SelectMany的重載之一具有一個參數resultSelector ,它將使用一個Group和一個User作為輸入來創建結果。 此版本非常適合您的需求

var result = dbContext.Groups.SelectMany(
    group => group.Users,
    (group, user) => new
    {
        // Select the Group properties you plan to use
        GroupId = group.GroupId,
        GroupName = group.Name,
        ...

        // Select the User properties you plan to use
        UserId = user.UserId,
        UserName = user.DisplayName,
        ...
    })

    // if desired do some ordering
    .OrderBy(joinedItem => joinedItem.GroupName);

暫無
暫無

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

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