我有以下的代码,应该获取一些书籍
,并从该书籍(Book
实体)中检索前2个标签
(Tag
实体)。所以Tags
是Book
实体的一个导航属性
。
using (var context = new FakeEndavaBookLibraryEntities())
{
Book firstBook = context.Set<Book>().Take(1).First();
var firstTwoTags = firstBook.Tags.OrderBy(tag => tag.Id).Skip(0).Take(2).ToList();
}
我期望获得由EF生成的以下SQL查询。
SELECT TOP(2)
[Extent2].[Id] AS [Id],
[Extent2].[Version] AS [Version],
[Extent2].[Name] AS [Name]
FROM [Literature].[BookTagRelation] AS [Extent1]
INNER JOIN [Literature].[Tag] AS [Extent2]
ON [Extent1].[TagId] = [Extent2].[Id]
WHERE [Extent1].[BookId] = 1 /* @EntityKeyValue1 - [BookId] */
相反,EF Profiler 显示 EF 正在生成 无限制结果集(例如 SELECT * FROM ..)。
SELECT [Extent2].[Id] AS [Id],
[Extent2].[Version] AS [Version],
[Extent2].[Name] AS [Name]
FROM [Literature].[BookTagRelation] AS [Extent1]
INNER JOIN [Literature].[Tag] AS [Extent2]
ON [Extent1].[TagId] = [Extent2].[Id]
WHERE [Extent1].[BookId] = 1 /* @EntityKeyValue1 - [BookId] */
我还尝试将.AsQueryable()
附加到firstBook.Tags
属性和/或删除.Skip(0)
方法,如下所示,但这也没有帮助。
var firstTwoTags = firstBook.Tags.AsQueryable().OrderBy(tag => tag.Id).Skip(0).Take(2).ToList();
同样的不良行为:
SELECT [Extent2].[Id] AS [Id],
[Extent2].[Version] AS [Version],
[Extent2].[Name] AS [Name]
FROM [Literature].[BookTagRelation] AS [Extent1]
INNER JOIN [Literature].[Tag] AS [Extent2]
ON [Extent1].[TagId] = [Extent2].[Id]
WHERE [Extent1].[BookId] = 1 /* @EntityKeyValue1 - [BookId] */
你是否曾经遇到过在使用Entity Framework 6时遇到相同的问题?
是否有任何方法可以解决这个问题,或者是我设计查询方式的问题...?
感谢任何提示!
Skip(toBeSkipped).Take(pageSize)
来实现分页。我会更新问题以使其更加清晰明了。 - AlexMelw