[英]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.