我想知道EF-Core是否为我们提供了一个已经通过WHERE子句进行了"预过滤"的属性?

例如:

我有一张Users人的桌子.因此..DbSet<User> Users.) 每个用户可以有零到多个Orders(..因此,DbSet<Order> Orders).

因此,用户应该如下所示:

public class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public List<Order> Orders { get; set; } 
}

所以现在我想要一个最新订单的房产:

例如:

public Order MostRecentOrder { get; set; }

这将由硬编码规则决定:最近的顺序.

这个是可能的吗?

否则,我觉得我必须在我编写的每个EF-CORE查询中使用这个LINQ查询,因为我关心这个属性.

另外,我曾经try 做一个扩展方法,但是EF查询生成器或其他东西崩溃了,说它不能把它翻译成SQL.

那么,这有可能吗?

推荐答案

只允许装入最后一个订单的有Filtered Includes个,还有Auto Include个.遗憾的是,目前它们无法组合在一起(https://github.com/dotnet/efcore/issues/30883)

你可以做什么作为替代:

将该属性创建为User Class上的getter:

public Order? MostRecentOrder => this.Orders.OrderByDesc(o => o.CreatedOn).FirstOrDefault()

在DbContext上创建一个方法,为应用了Include的用户返回IQueryable:

public IQueryable<User> UserWithOrder() {
    return this.Users.Include(u => u.Orders.OrderByDesc(o => o.CreatedOn).Take(1))
}

那么您应该始终使用该方法来访问用户.直接使用DbSet并访问MostRecentOrder属性仍会导致异常.

如果您想要编译时安全,您可能可以通过创建一个额外的类来工作,该类具有此属性,并且从方法而不是直接从User类返回,但从我的头脑中我不确定有什么简单的通用解决方案来实现这一点.

Csharp相关问答推荐

[0-n]范围内有多少个Integer在其小数表示中至少包含一个9?

System.文本.Json现在总是需要无参数构造函数吗?

Blazor:用参数创建根路径

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

将列表字符串映射为逗号分隔字符串<>

如何在C#中删除一个特殊字符,如"使用Regex"

C#.NET依赖项注入顺序澄清

自动映射程序在GroupBy之后使用项目

将现有字段映射到EFCore中的复杂类型

注册所有IMediatR类

JSON空引用异常仅在调试器中忽略try-Catch块,但在其他上下文中捕获得很好

在.NET核心项目中创建Startup.cs比在Program.cs中注册服务好吗?

C#-VS2022:全局使用和保存时的代码清理

调用Task.Run()与DoSomethingAsync()有什么不同?

我如何让我的秒表保持运行场景而不重置

为什么C#认为这个非托管 struct 有一个重叠

Azure Functions v4中的Serilog控制台主题

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

FakeItEasy自动嘲弄内容

这是T自身的布尔表达式是什么意思?