gpt4 book ai didi

c# - Entity Framework Core 忽略 .Include(..) 而没有 .ToList(..) 间接

转载 作者:太空狗 更新时间:2023-10-29 19:47:43 24 4
gpt4 key购买 nike

如前所述in "Loading Related Data" from EF Core Documentation我们可以使用 .Include(..)DbSet 急切加载导航属性(或通用 IQueryable<T> 链接回 EF 上下文)。

这意味着,给定以下模型:

public class TestEntityA
{
public int Id { get; set; }
public int TestEntityBId { get; set; }
public TestEntityB TestEntityB { get; set; }

public string BProperty { get { return TestEntityB.Property; } }
}

public class TestEntityB
{
public int Id { get; set; }
public string Property { get; set; }
}

.. 那么像下面这样的代码应该可以工作:

context.TestEntityAs
.Include(m => m.TestEntityB)
.Any(m => m.BProperty == "Hello World");
/*
* Note that the below DOES work by using the nav property directly
* in the query, but that is not always going to be an option for
* whatever reason. If it's .Included it should be available through
* INNER JOINing it into the base query before the .Any runs.
* .Any(m => m.TestEntityB.Property == "Hello World");
*/

然而事实并非如此。

我注意到有一个注意事项 .Include()如果查询未返回最初请求的类型,则可以忽略:

If you change the query so that it no longer returns instances of the entity type that the query began with, then the include operators are ignored. [snip] By default, EF Core will log a warning when include operators are ignored.

我不确定如何在上面调用 .Any()这是相关的。是的,查询没有返回原始类型(它当然返回了 bool),但同时,警告也没有被记录以建议它被忽略。

我的问题是:

  • 这是一个预期有效的用例吗?我应该在 EF Core 中提出错误吗?
  • 如果不是预期的, 解决方法如下(调用 .ToList() ),但这显然会加载所有内容,以查明我们在 .Any() 上是否有任何内容这很容易成为一个查询(在 EF6 中也是如此)。获得此 .Any() 的解决方法是什么在服务器端工作,因此不需要 ToList 将其放入内存?

解决方法:

context.TestEntityAs
.Include(m => m.TestEntityB)
.ToList()
.Any(m => m.BProperty == "Hello World");

完整的可重现样本:https://gist.github.com/rudiv/3aa3e1bb65b86ec78ec6f5620ee236ab

最佳答案

按照命名约定,它应该可以工作您可以尝试使用这段代码手动配置模型之间的关系

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TestEntityA>()
.HasOne(x => x.TestEntityB)
.WithMany()
.HasForeignKey(x => x.TestEntityBId);
}

关于c# - Entity Framework Core 忽略 .Include(..) 而没有 .ToList(..) 间接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43541527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com