首页 > 解决方案 > 带有排除过滤器的通用 linq 查询

问题描述

我的数据库表中有一个用于软删除的模式。我想生成 Linq 查询来获取未过期的数据。

例如,对于下面的两个表,一个用户可以有多个地址。可以通过将 SoftDeleteDate 设置为 Datetime.Now 来软删除地址。在获取用户时,我们可以创建一个查询以排除 UserAddress,其中 UserAddress.SoftDeleteDate 不为空。

TABLE [dbo].[User](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](25) NOT NULL,
[SoftDeleteDate] [datetimeoffset](7) NULL
)

TABLE [dbo].[UserAddress](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[UserId] [bigint] NOT NULL,
[StreetName] [bigint] NOT NULL,
[City] [nvarchar](50) NULL,
[State] [nvarchar](50) NULL,
[SoftDeleteDate] [datetimeoffset](7) NULL
)

这是一个简单的用例。在实践中,诸如用户之类的实体可以链接到子实体以进行若干程度的嵌套。

使用 DbContext 可以轻松创建用于获取的通用方法。这些方法使用“包含”获取嵌套实体。但是 linq 没有“排除”的概念

T GetDataById<T>(long id)
{
    return Context.Set<T>().Find(id);
}

我想创建一个生成 Linq 查询的通用方法,该方法将任何过期的子实体排除在不超过三度的嵌套中。这样,当我获取用户时,我可以排除过期的用户地址。

我看过一些关于 PredicateBuilder http://www.albahari.com/nutshell/predicatebuilder.aspx的帖子,但不确定它是否可以用来生成带有所需过滤器的查询。

想知道那里有没有人解决过这个问题。

标签: c#linq

解决方案


推荐阅读