我的数据库表中有一个模式可以进行软删除。我想生成Linq查询以获取未过期的数据。
例如,使用下面的两个表,一个用户可以有多个地址。通过将SoftDeleteDate设置为Datetime.Now,可以软删除地址。提取用户时,我们可以创建查询以排除UserAddress,其中UserAddress.SoftDeleteDate不为null。
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查询的通用方法,该查询将所有过期的子实体排除在不超过三个嵌套度的范围内。这样,当我获取用户时,可以排除过期的UserAddresses。
我看过一些有关PredicateBuilder http://www.albahari.com/nutshell/predicatebuilder.aspx的帖子,但不确定是否可以将其用于生成具有所需过滤器的查询。
想知道是否有人在解决这个问题。