gpt4 book ai didi

c# - 如何将 ThenInclude 实现到 EF Core 自定义规范中?

转载 作者:行者123 更新时间:2023-12-04 14:37:23 24 4
gpt4 key购买 nike

英孚核心 3.1
我见过Specification例如,并希望实现 ThenInclude 模式。

public static class QuerySpecificationExtensions
{
public static IQueryable<T> Specify<T>(this IQueryable<T> query, ISpecification<T> spec) where T : class
{
// fetch a Queryable that includes all expression-based includes
var queryableResultWithIncludes = spec.Includes
.Aggregate(query,
(current, include) => current.Include(include));

// modify the IQueryable to include any string-based include statements
var secondaryResult = spec.IncludeStrings
.Aggregate(queryableResultWithIncludes,
(current, include) => current.Include(include));

// return the result of the query using the specification's criteria expression
return secondaryResult.Where(spec.Criteria);
}
}

我可以将其添加到字符串中,例如“User.UserRole.Role”,但我想实现对象。
也许那里不可能?

最佳答案

Includes前述成员ISpecification<T>被声明为

List<Expression<Func<T, object>>> Includes { get; }

问题是 EF Core Include/ ThenInclude链不能用 Expression<Func<T, object>> 表示.此模式在 EF6 中使用,它支持包含表达式内的特殊语法 ( Select ) 来解析集合元素。但是 EF Core 不支持开箱即用。

插入 EF Core 模式的最简单、最自然的方法是更改​​定义如下:
List<Func<IQueryable<T>, IIncludableQueryable<T, object>>> Includes { get; }

为具有 User 的实体添加样本属性(property)有 UserRoles收藏有 Role属性将是这样的:
Includes.Add(q => q.Include(e => e.User).ThenInclude(e => e.UserRoles).ThenInclude(e => e.Role));

Specify的对应部分方法实现将是:
var queryableResultWithIncludes = spec.Includes
.Aggregate(query,
(current, include) => include(current));

关于c# - 如何将 ThenInclude 实现到 EF Core 自定义规范中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60300705/

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