微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Entity Framework Core 5 - 带有 Include + Skip/Take 的 FROM 子句

如何解决Entity Framework Core 5 - 带有 Include + Skip/Take 的 FROM 子句

我正在将我的 ASP NET Core Web 应用程序从 .NET Core 2.1 升级到 .NET Core 5.0。
当我同时使用 Include() 和 Skip()/Take() 时,我注意到从 LINQ 语句生成 sql 查询的方式略有不同。

我有两个表:ShopsCompanies - 每个 Shop 都分配给一个 Company。
这是两个表定义:

"C:\Program Files\Java\jdk-16.0.1\bin\java.exe" -Dkotlin.repl.ideMode=true -Dfile.encoding=UTF-8 @C:\Users\simpl\AppData\Local\Temp\idea_arg_file2072955097
exception: java.lang.ExceptionInInitializerError
    at com.intellij.pom.java.languageLevel.<clinit>(LanguageLevel.java:25)
    at com.intellij.core.CoreLanguageLevelProjectExtension.<init>(CoreLanguageLevelProjectExtension.java:26)
    at com.intellij.core.JavaCoreProjectEnvironment.<init>(JavaCoreProjectEnvironment.java:42)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment.<init>(KotlinCoreProjectEnvironment.kt:26)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$ProjectEnvironment.<init>(KotlinCoreEnvironment.kt:121)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:90)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:52)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:88)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:44)
    at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:98)
    at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:76)
    at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:45)
    at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit(CLITool.kt:227)
    at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit$default(CLITool.kt:222)
    at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMain(CLITool.kt:214)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler$Companion.main(K2JVMCompiler.kt:271)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.main(K2JVMCompiler.kt)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected void java.util.ResourceBundle.setParent(java.util.ResourceBundle) accessible: module java.base does not "opens java.util" to unnamed module @55141def
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
    at com.intellij.util.ReflectionUtil.makeAccessible(ReflectionUtil.java:252)
    at com.intellij.util.ReflectionUtil.getDeclaredMethod(ReflectionUtil.java:269)
    at com.intellij.DynamicBundle.<clinit>(DynamicBundle.java:22)
    ... 17 more


Process finished with exit code 2

...这是我所指的 LINQ 表达式:

public class Shop
{
  public int ShopID { get; set; }
  public string Code { get; set; }
  public string Name { get; set; }
  
  public int CompanyID { get; set; }
  public Company Company { get; set; }
}

public class Company
{
  public int CompanyID { get; set; }
  public string Code { get; set; }
  public string Name { get; set; }
  public string VATCode { get; set; }
}

在 EFCore 2.1 中,这在此 sql Server 查询中进行了翻译:

shopIQ = _context.Shops.Include(x => x.Company)
                       .OrderBy(x => x.Code)
                       .Skip(0).Take(20);

...但是在 EFCore 5.0 中,这被转换为:

SELECT [x].[ShopID],[x].[Code],[x].[Name],[x].[CompanyID],[x.Company].[Code] AS [Code0],[x.Company].[Name] AS [Name0],[x.Company].[VATCode] AS [VATCode]
FROM [Shops] AS [x]
INNER JOIN [Companies] AS [x.Company] ON [x].[CompanyID] = [x.Company].[CompanyID]
ORDER BY [x].[Code]
OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY

这对我来说有点奇怪。

有人知道为什么会这样吗?

谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。