C# .Include()与.Take()和.Skip()一起创建错误的SQL查询

C# .Include()与.Take()和.Skip()一起创建错误的SQL查询,c#,sql-server,asp.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,Entity Framework Core,我只想用EntityFramework加载一些带有各自“域”的“事件类型”。关系为N:1,即EventType引用列为EventType.DomainID的域 这很有效 IEnumerable data=await dbContext.EventTypes .Include(x=>x.Domain).ToListAsync() 它生成的SQL代码: 选择[x].[ID],[x].[DomainID],[x].[HtmlEventDescription],[x].[Name],[x].[Url],

我只想用EntityFramework加载一些带有各自“域”的“事件类型”。关系为N:1,即EventType引用列为EventType.DomainID的域

这很有效

IEnumerable data=await dbContext.EventTypes
.Include(x=>x.Domain).ToListAsync()

它生成的SQL代码:

选择[x].[ID],[x].[DomainID],[x].[HtmlEventDescription],[x].[Name],[x].[Url],[d].[ID],[d].[DebugHost],[d].[Host]
从[EventTypes]到[x]
在[x].[DomainID]=[d].[ID].[ID]上将[Domains]作为[d]进行内部联接。

但现在我想包括分页

IEnumerable data=wait dbContext.EventTypes.Include(x=>x.Domain).Take(pageSize)
.Skip(pageIndex*10).toListSync()

它生成的SQL是可以的,可以在SQL管理器中尝试,但它只返回域的列

选择[d].[ID],[d].[DebugHost],[d].[Host]
从(
选择顶部(@u p_0)[x].[ID],[x].[DomainID],[x].[HtmlEventDescription],[x].[Name],[x].[Url]
从[EventTypes]到[x]
)AS[t]
在[t].[DomainID]=[d].[ID]上将[Domains]作为[d]进行内部联接
订购人(选择1)
偏移量@\u p\u 1行

但现在它也产生了一个例外

Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory:错误:在迭代查询结果时数据库中发生异常。
System.InvalidOperationException:读取属性“EventType.DomainID”的数据库值时发生异常。预期的类型为“System.Int32”,但实际值的类型为“System.String”。-->System.InvalidCastException:无法将“System.String”类型的对象强制转换为“System.Int32”类型。

我不知道我做错了什么。
为什么EF在使用
dbContext.EventTypes
查询EventTypes表时只使用“Domain”属性创建查询?我怀疑这就是它试图将字符串强制转换为int的原因,因为首先在结果中没有DomainID列,它可能正试图将
Domain.DebugHost
Debug.Host
的字符串列强制转换为
EventType.DomainID
,正如我在评论中建议的那样:

问题是这些线

.Take(页面大小)
.Skip(页面索引*10)

一定是不同的顺序。必须先跳过才能开始。现在它工作正常了

.Skip(页面索引*页面大小)

.按照我在评论中得到的建议(页面大小)

问题是这些线

.Take(页面大小)
.Skip(页面索引*10)

一定是不同的顺序。必须先跳过才能开始。现在它工作正常了

.Skip(页面索引*页面大小)

.Take(pageSize)

通常在分页时,您首先
跳过
一些记录,然后
获取当前页面的一些记录。您是否尝试更改呼叫顺序?您的跳过/接受顺序已颠倒。应该是。
Skip(pageIndex*10)。Take(pageSize)
你也应该做
Skip(pageIndex*pageSize)
?哦,天哪,你说得对。英孚至少可以告诉我一些更准确的事情……朱哈尔:是的,谢谢!:)顺便说一句,最好指定您在标记中使用EF Core,直到它稳定(目前不是),确切的版本。通常在分页时,您首先跳过一些记录,然后为当前页面获取一些记录。您是否尝试更改呼叫顺序?您的跳过/接受顺序已颠倒。应该是。
Skip(pageIndex*10)。Take(pageSize)
你也应该做
Skip(pageIndex*pageSize)
?哦,天哪,你说得对。英孚至少可以告诉我一些更准确的事情……朱哈尔:是的,谢谢!:)顺便说一句,最好指定您在标记中使用EF核心,直到它变得稳定(目前不是),确切的版本。