簡體   English   中英

實體框架包含一對多關系中的單個對象

[英]Entity Framework Include Single Object from One-To-Many Relationship

我正在嘗試構建一個單一的查詢來獲取所有Tour對象的列表,每個tour的最新版本都是預先加載的(最近一次是最近創建的)。 請參閱以下型號。 每個Tour都可以有多個相關的TourVersion對象

class Tour {
    public Guid TourId { get; set; }
    public virtual TourVersion CurrentTourVersion { get; set; }
    // Other properties etc.
}
class TourVersion {
    public Guid TourId { get; set; }
    public DateTime CreatedOn { get; set; }
    // Other properties etc.
}

我能夠完成我想要為每個Tour運行另一個查詢:

var tours = context.Tours.ToList();

foreach (var tour in tours)
{
    tour.CurrentTourVersion = context.TourVersions
        .Where(t => t.TourId == tour.Id)
        // ToUnixTime is a custom extension method that returns a long
        .OrderByDescending(t => t.CreatedOn.ToUnixTime())
        .FirstOrDefault();
}

我希望能夠在一個查詢中完成此任務。 有什么建議么?

實體框架會自動為您加載相關實體,直到上下文處於活動狀態。 你得到了Tours的列表

var tours = dbContext.Tours.ToList();

例如,你可以通過調用獲得巡演版本

tours[i].CurrentTourVersion;

除非在獲得游覽版本之前將dbContext放置在某個地方,否則您將需要急切加載(請參閱此處 )。 這樣您就可以獲得並保留相關對象。

var tours = dbContext.Tours.Include(obj=>obj.CurrentTourVersion).ToList();

結束解決它:

var tours = (from tour in context.Tours
             join v in context.TourVersions on tour.TourId equals v.TourId
             where v.CreatedOn == context.TourVersions.Select(b => b.CreatedOn).Max()
                select new
                {
                    TourId = tour.Id,
                    CurrentTourVersion = v
                }).ToList().Select(tour => new Tour
                {
                    TourId = tour.Id,
                    CurrentTourVersion = tour.CurrentTourVersion
                });

return tours.ToList();

解釋為什么這有效:

  • 使用最新版本加入每個游覽
    • 通過針對最大日期選擇版本來查找最新版本
  • 使用TourId和CurrentTourVersion字段創建匿名對象
  • 將其映射到Tour對象列表

EF有一個限制,強制您將聯接的結果放入匿名對象。 有關詳細信息,請參閱此答案

暫無
暫無

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

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