簡體   English   中英

子表上的 EF Core 聯接

[英]EF Core join on sub table

我有這樣設置的三個類:

public class Item
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<UserItem> UserItems { get; set; }
}

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<UserItem> UserItems { get; set; }
}

public class UserItem
{
    public int ID { get; set; }
    public int UserID { get; set; }
    public int ItemID { get; set; }
}

Entity Framework 使用正確的外鍵在 SQL 服務器數據庫中生成表。 我可以像這樣查詢ItemUser以獲取UserItem collections :

var a = context.DBUser.Include(s => s.UserItems);
var b = context.DBItem.Include(s => s.UserItems);

我不滿意的是我如何從UserItem 在 SQL 我會做這樣的事情

SELECT * FROM Users U
LEFT JOIN UserItems UI
    ON U.ID = UI.UserID
LEFT JOIN Items I
    ON UI.ItemID = I.ID

在 C# 我需要求助於這個:

var c = from user in _context.DBUsers
    join userItem in _context.DBUserItems
        on user.ID equals userItem.UserID into ui
        from userItem in ui.DefaultIfEmpty()
    join item in _context.DBItems
        on userItem.ItemID equals item.ID into i
        from item in i.DefaultIfEmpty()
    select new
    {
        user,
        userItem,
        item
    };

鑒於 EF 中的表之間應該已經存在關系,這感覺不對

您還需要向UserItem添加導航:

public class UserItem
{
    public int ID { get; set; }
    public int UserID { get; set; }
    public int ItemID { get; set; }

    public User User { get; set; }
    public Item Item { get; set; }
}

那么你的查詢可以是這樣的:

var users = context.DBUser
    .Include(x => x.UserItems)
    .ThenInclude(x => x.Item);

另請注意,如果您使用的是 .NET 5,則可以完全省略UserItem “連接實體”:

public class Item
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Item> Items { get; set; }
}

這將簡化您的查詢:

var users = context.DBUser.Include(x => x.Items);

暫無
暫無

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

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