簡體   English   中英

EF Core 從列表中動態過濾

[英]EF Core dynamically filter from list

我正在努力在前端表上創建一個通用動態過濾器。 這個想法是每列都會有一個過濾器,您可以在其中 select 列的值。 列名必須是完全動態的和選定的值。 我們正在使用 .NET 5 和 EF Core 5。

我想要的 SQL 查詢是:


SELECT * 
FROM Users
WHERE externalId IN ('1234', '5678');

楷模:


public class ColumnFilter
    {
        [Required]
        public string Name { get; set; } // column name
        public List<string> SelectedValues { get; set; } = new List<string>(); // values selected in this column
    }

public class User {
        public string Name { get; set; } 
        public string ExternalId { get; set; } 
}

簡化代碼:


//columnfilter really comes from API request
var columnFilter = new ColumnFilter{
Name = "ExternalId",
SelectedValues = new List<string>{ "1234", "5678" }
};

var queryable = _context.Users.AsNoTracking();

queryable = queryable.Where(f => columnFilter.SelectedValues.Contains(EF.Property<string>(f, columnFilter.Name)));

var values = await queryable.ToListAsync(); // 0 results

EF Core 生成此查詢:

      SELECT *
      FROM [Users] AS [u]
      WHERE 0 = 1

我如何讓它動態工作?

這是一個使用字符串值的示例:

var queryable = _context.Users.AsNoTracking();

queryable = queryable.FilterDynamic(columnFilter.Name, columnFilter.SelectedValues);

public static class QueryableExtensions
{
    public static IQueryable<T> FilterDynamic<T>(this IQueryable<T> query, string fieldName, ICollection<string> values)
    {
        var param = Expression.Parameter(typeof(T), "e");
        var prop = Expression.PropertyOrField(param, fieldName);
        var body = Expression.Call(typeof(Enumerable), "Contains", new[] {typeof(string)},
            Expression.Constant(values), prop);
        var predicate = Expression.Lambda<Func<T, bool>>(body, param);
        return query.Where(predicate);
    }
}

我的解決方案確實有效。 我還涉及其他一些導致問題的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM