【发布时间】:2021-04-16 20:28:49
【问题描述】:
我正在努力在前端表上创建一个通用动态过滤器。这个想法是每列都有一个过滤器,您可以在其中选择该列的值。列名必须是完全动态的和选定的值。我们正在使用 .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
如何让它动态工作?
【问题讨论】:
-
我认为你应该看看
Dynamic LINQ library,它应该可以为你解决问题。动态构建表达式 -
该库对 sql 注入安全吗?
-
您可以简单地动态构建 Expression,@Svyatoslav Danyliv 解决方案也应该是一个非常好的解决方案
标签: c# asp.net entity-framework .net-core entity-framework-core