ASP.NET 5 Web 项目中的 Entity Framework Core - 自动生成 LINQ 过滤器查询

Jan*_*šeň 8 c# asp.net reactjs entity-framework-core

我有 .NET 5 MVC 项目(原始 ASP.NET 3.1 Core MVC),我使用 EF Core 5 + React + Redux 和 MSSql。

我正在寻找一种查找方式,如何通过 REST GET 请求将数据从 React 表单(带有、选择、输入、范围框的表单)发送到后端,并从沙子过滤器中自动生成 WHERE SQL 查询,并带有选定的值。

是否有任何 EF Core 功能,或者我必须在 FOREACH 中生成此查询,例如:

query = ...
foreach param_filter in
   query = query.Where(...)
Run Code Online (Sandbox Code Playgroud)

我有一个带有过滤器的 HTML 表单,它们的值是从数据库生成的,每个网站页面都有另一个过滤器的数量和类型,但每个过滤器都有一个唯一的字符串 ID

添加信息:

输入请求:

{
    "name": "Application",
    "values": [
        {
            "name": "Smart Homes & Cities | Industrial | Automotive | Security | Consumer",
            "value": "Smart Homes & Cities | Industrial | Automotive | Security | Consumer"
        }
    ],
    "type": "select",
    "field": "ant_application",
    "sort": 4
}
Run Code Online (Sandbox Code Playgroud)

我想使用过滤器数组获取 REST API 请求,并为每个字段类型生成如下内容:

foreach (var f in filters)
    query.Where(p => p.Field == p.field).AndValueNotIn(f.values);
Run Code Online (Sandbox Code Playgroud)

其中 p 表示产品列表,其中每个产品都有自己的字段值

现在我在 EF Core DB 过程调用中使用,如:

.FromSqlInterpolated($"EXEC GetGroupFilters {groupId}").AsEnumerable()
Run Code Online (Sandbox Code Playgroud)

MSSql 过程具有唯一的 SQL(连接、选择、联合),并从我加载到对象中并使用 LINQ 的 DB 返回格式化的行,我有两个选择:

  1. 使用SQL WHERE从过滤器生成原始文本并将其发送到过程中
  2. 使用 C# 在后端生成LINQ .Where()

我认为然后选择 1 会更快更好,但仍然找到最佳解决方案

有没有更好的解决办法?

小智 1

其实我也做过这样的事

我建议您通过下面的链接了解Linq.Expression中的表达式树,然后您才能在此链接中找到您的问题答案

但为了更好地理解如何实现这一点,我在下面放置了一些示例代码:

     // Comment   _Queryable.Where(x=>x.Something) | This Queryable from 
     // Type Of Generics (Where Any model With Any Field With This)
     var query = Expression.Equal(Expression.Property(keyParameter, filter.Key),
                        Expression.Constant(filter.Value));
                    MethodCallExpression whereExpression = Expression.Call(
                        typeof(Queryable),
                        "Where",
                        new Type[] {_queryable.ElementType},
                        _queryable.Expression,
                        Expression.Lambda<Func<T, bool>>(query, new 
                      ParameterExpression[] {keyParameter}));
                    _queryable = 
          _queryable.Provider.CreateQuery<T(whereExpression);
Run Code Online (Sandbox Code Playgroud)

抱歉我的英语不好希望它能帮助你