Entity Framework 包含一对多关系中的单个对象
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();
}
我希望能够在单个查询中完成此操作。有什么建议吗?
Entity framework 自动为您加载相关实体,直到上下文处于活动状态。您通过
获得旅游列表
var tours = dbContext.Tours.ToList();
例如,您可以通过调用
获得旅游版
tours[i].CurrentTourVersion;
除非在获得游览版本之前将 dbContext 放置在某处,否则您将需要预先加载(请参阅 here)。这样您就可以获取并保留相关对象。
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 有一个限制,强制您将联接的结果放入匿名对象中。参见 this answer for more info
我正在尝试构建一个查询来获取所有 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();
}
我希望能够在单个查询中完成此操作。有什么建议吗?
Entity framework 自动为您加载相关实体,直到上下文处于活动状态。您通过
获得旅游列表var tours = dbContext.Tours.ToList();
例如,您可以通过调用
获得旅游版tours[i].CurrentTourVersion;
除非在获得游览版本之前将 dbContext 放置在某处,否则您将需要预先加载(请参阅 here)。这样您就可以获取并保留相关对象。
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 有一个限制,强制您将联接的结果放入匿名对象中。参见 this answer for more info