EF 核心过滤
EF Core Filtering
我有一些目前看起来像这样并在 EF Core 中工作的东西:
DbContext.Computers.OrderByDirection(state.SortDirection,
x => x.Actions.FirstOrDefault(y => y.GetType() == typeof(PingAction) &&
y.History.Any(z => z.Status == Status.Succeeded &&
(DateTime.Now - z.WhenExecuted).TotalMinutes < 10)))
但是我还需要在别处使用 x
函数并且不想多次对其进行硬编码。我怎样才能将该函数保存到变量或其他东西,并且仍然允许它与 EF 核心的服务器端过滤一起使用,因为当然这将被转换为 SQL?
更新
OrderByDirection
的签名:
public static IOrderedEnumerable<TSource> OrderByDirection<TSource, TKey>(this IEnumerable<TSource> source, SortDirection direction, Func<TSource, TKey> keySelector)
public static IOrderedQueryable<TSource> OrderByDirection<TSource, TKey>(this IQueryable<TSource> source, SortDirection direction, Expression<Func<TSource, TKey>> keySelector)
我认为您可以将表达式提取到一个类似于此的变量中:
(我只是根据您的 属性 名称猜测 class 名称,它们在您的代码中并不明显):
Expression<Func<Computer, Action>> expression = x => x.Actions.FirstOrDefault(
action => action.GetType() == typeof(PingAction) && action.History.Any(
history => history.Status == Status.Succeeded && (DateTime.Now - z.WhenExecuted).TotalMinutes < 10));
DbContext.Computers.OrderByDirection(state.SortDirection, expression);
那么这个表达式可以在别处重复使用。
我有一些目前看起来像这样并在 EF Core 中工作的东西:
DbContext.Computers.OrderByDirection(state.SortDirection,
x => x.Actions.FirstOrDefault(y => y.GetType() == typeof(PingAction) &&
y.History.Any(z => z.Status == Status.Succeeded &&
(DateTime.Now - z.WhenExecuted).TotalMinutes < 10)))
但是我还需要在别处使用 x
函数并且不想多次对其进行硬编码。我怎样才能将该函数保存到变量或其他东西,并且仍然允许它与 EF 核心的服务器端过滤一起使用,因为当然这将被转换为 SQL?
更新
OrderByDirection
的签名:
public static IOrderedEnumerable<TSource> OrderByDirection<TSource, TKey>(this IEnumerable<TSource> source, SortDirection direction, Func<TSource, TKey> keySelector)
public static IOrderedQueryable<TSource> OrderByDirection<TSource, TKey>(this IQueryable<TSource> source, SortDirection direction, Expression<Func<TSource, TKey>> keySelector)
我认为您可以将表达式提取到一个类似于此的变量中:
(我只是根据您的 属性 名称猜测 class 名称,它们在您的代码中并不明显):
Expression<Func<Computer, Action>> expression = x => x.Actions.FirstOrDefault(
action => action.GetType() == typeof(PingAction) && action.History.Any(
history => history.Status == Status.Succeeded && (DateTime.Now - z.WhenExecuted).TotalMinutes < 10));
DbContext.Computers.OrderByDirection(state.SortDirection, expression);
那么这个表达式可以在别处重复使用。