实体框架 - 加载相关实体 [英] Entity Framework - eager loading of related entities
问题描述
对不起,标题不是更具体 - 我不知道如何简洁的描述。
我有一个多对多关系的旅行和位置,除了位置不需要知道使用它们的行程之外,这是很简单的。我创建了这些实体来表示:
Sorry the title isn't more specific - I didn't know how to describe this succinctly. I have Trips and Location that have a many-to-many relationship - straightforward except that Locations have no need to know about the Trips that use them. I've created these entities to represent this:
public class Trip
{
public int TripId { get; set; }
public virtual IList<TripLocation> TripLocations { get; set; }
}
public class TripLocation
{
public int TripId { get; set; }
public int LocationId { get; set; }
public virtual Location Location { get; set; }
}
public class Location
{
public int LocationId { get; set; }
// Note: Intentionally no collection of Trips
}
我可以得到旅行渴望加载它的TripLocations,但我不能得到TripLocations渴望加载他们的位置。我已经尝试了一系列流畅的配置和包括在查询中,如
I can get the Trip to eager load it's TripLocations but I can't get the TripLocations to eager load their Locations. I've tried a bunch of combinations fluent configuration and "Include"ing in the query such as
IQueryable<Trip> query = from trip in context
.Include(r =>r.TripLocations)
.Include(r => r.TripLocations.Select(tl => tl.Location))
select ride;
任何建议非常感谢!
推荐答案
我在这里重新创建了您的场景,我可以在单个查询中获取所有结果。
I recreated your scenario here and I was able to get all the results in a single query.
var a = from trip in context.Trips.Include("TripLocations.Location")
select trip;
这是查询我的数据库:
SELECT
[Project1].[TripId] AS [TripId],
[Project1].[Name] AS [Name],
[Project1].[C1] AS [C1],
[Project1].[TripId1] AS [TripId1],
[Project1].[LocationId] AS [LocationId],
[Project1].[LocationId1] AS [LocationId1],
[Project1].[Name1] AS [Name1]
FROM ( SELECT
[Extent1].[TripId] AS [TripId],
[Extent1].[Name] AS [Name],
[Join1].[TripId] AS [TripId1],
[Join1].[LocationId1] AS [LocationId],
[Join1].[LocationId2] AS [LocationId1],
[Join1].[Name] AS [Name1],
CASE WHEN ([Join1].[TripId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM [dbo].[Trips] AS [Extent1]
LEFT OUTER JOIN (SELECT [Extent2].[TripId] AS [TripId], [Extent2].[LocationId] AS [LocationId1], [Extent3].[LocationId] AS [LocationId2], [Extent3].[Name] AS [Name]
FROM [dbo].[TripLocations] AS [Extent2]
INNER JOIN [dbo].[Locations] AS [Extent3] ON [Extent2].[LocationId] = [Extent3].[LocationId] ) AS [Join1] ON [Extent1].[TripId] = [Join1].[TripId]
) AS [Project1]
ORDER BY [Project1].[TripId] ASC, [Project1].[C1] ASC
更新:
如果你想保持与lambda版本,这将做的工作:
If you wanna keep with the lambda version, this will do the work:
IQueryable<Trip> query = from ride in context.Set<Trip>()
.Include(t=>t.TripLocations.Select(l=>l.Location))
select ride;
有关 MSDN blog 。
这篇关于实体框架 - 加载相关实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!