簡體   English   中英

在 EF Core 中,我應該使用數據庫查詢來連接一對多表還是使用 efcore 在 c# 中手動連接?

[英]In EF Core, should I use database query to join one to many table or use manual joining by efcore in the c#?

我在 EF Core 代碼優先數據庫中有三個表,它們具有一對多對一的關系:

public class Operator
{
    [Key]
    public string Username { get; set; }
    public string PhoneNumber { get; set; }

    public List<Ticket> Tickets { get; set; }
}

public class Ticket
{
    public int TicketId { get; set; }
    public DateTime Date { get; set; }
    public int LotNumber { get; set; }
    public enum TicketStatus { get; set; }

    // navigation properties
    public Specification Specification { get; set; }
    
    // foreign keys
    public string OperatorUsername { get; set; }
    public int SpecificationId { get; set; }
}

public class Specification
{
    public int SpecificationId { get; set; }
    public int Wages { get; set; }
    public string ColorName { get; set; }
    public string SizeName { get; set; }
    public string Description { get; set; }
}

如您所見,一個運營商可以有很多票,一個規范也可以有很多票。

然而,在一個規范中,我們可以有成百上千張票。 現在的問題是我想使用 EF Core 從操作員開始獲取數據,以檢查操作員參加過的所有票證以及票證的規格是什么。

所以這現在在我的 controller 里面。

public Task<Operator> GetOperatorWithTickets(Username)
{
    return await context.Operator
                        .Include(x => x.Tickets)
                        .ThenInclude(y => y.Specification)
                        .FirstOrDefaultAsync(c => c.Username == Username);
}

然而,在檢查 EF Core 生成的查詢后,我發現 EF Core 使用連接查詢將所有三個表放在一起,我認為在連接查詢中為每張票繼續掃描表Specification可能不是很有效。

我正在考慮使用FindAsync這種方法來重用現有的跟蹤Specification實體

public Task<Operator> GetOperatorWithTickets(Username)
{
    Operator Operator await context.Operator
                                   .Include(x => x.Tickets)
                                   .FirstOrDefaultAsync(c => c.Username == Username);
 
    foreach (Ticket ticket in Operator.Tickets)
    {
         ticket.Specification = await context.ticket.FindAsync(ticket.SpecificationId);
    }

    return Operator;
}

我相信第二種方法可以減少數據庫開銷,因為數據庫掃描表Specification只會在實體規范尚未檢索所有以前的任何門票時執行,否則現有實體將一次又一次地用於數百甚至數千張門票共享相同的規格。

我仍然是新手,不確定數據庫可能執行的所有緩存以減少第一種方法的開銷,因此在我看來,第二種方法應該優於第一種方法。 您對此有何看法? 我應該堅持使用第一種方法還是遷移到第二種方法?

閱讀一些評論后,我相信數據庫捕獲會自動改進使用第一種方法的數據檢索,因此即使會一次又一次地檢索相同的數據,但數據庫捕獲將有助於減少開銷並顯着提高連接方法的數據庫速度。

暫無
暫無

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

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