如何在 System.Linq.Dynamic.Core 中执行此操作
Date is empty & Date is not empty
,
我目前正在这样做,但不起作用:
if (filter.Operator.StartsWith("is empty") ||
filter.Operator.StartsWith("is not empty"))
{
filterOp = filter.Operator.StartsWith("is not") ? "!=" : "==";
qs = $"{filter.Column.PropertyName} {filterOp} ''";
}
query = query.Where(qs);
回答您的一堆问题,以帮助您完成今年的工作。
MudBlazor
已经可以构建过滤器表达式,不需要像 Dynamic.LINQ
这样的额外拐杖。我已经检查过这段代码,它应该可以与 EF Core 一起使用。
有功能:
public static class FilterExpressionGenerator
{
public static Expression<Func<T, bool>> GenerateExpression<T>(IFilterDefinition<T> filter, FilterOptions? filterOptions)
...
所以,基本上你可以通过以下方式使用这个功能:
query = query.Where(FilterExpressionGenerator.GenerateExpression<GreenPaperItem>(filter));
如果您有这些定义的列表,您可以创建辅助函数,将此列表应用于任何
IQueryable
public static class MudBlazorFilterHelper
{
public static IQueryable<T> ApplyFilter<T>(this IQueryable<T> query, IEnumerable<IFilterDefinition<T>> filterDefinitions)
{
foreach(var filter in filterDefinitions)
{
query = query.Where(FilterExpressionGenerator.GenerateExpression<T>(filter));
}
return query;
}
}
回答以下评论:
但是为了检查它最后是否不可枚举,我收到错误“给定的‘IQueryable’不支持生成查询字符串。”当我想将查询转换为ToQueryString()
扩展方法
ToQueryString()
仅当IQueryable
从DbSet
开始时才能调用,不适用于从IQueryable
通过调用IEnumerable
创建的AsQueryable()
。这些 IQueryable
具有不同的 Provider
并且 ToQueryString()
期望该提供商是特定的 EF Core 提供商。