【问题标题】:Entity Framework Core in ASP.NET 5 web project - Autogenerate LINQ filters queryASP.NET 5 Web 项目中的 Entity Framework Core - 自动生成 LINQ 过滤器查询
【发布时间】:2021-05-03 06:44:39
【问题描述】:

我有 .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(...)

我有一个带有过滤器的 HTML 表单,它们的值是从 DB 生成的,每个网站页面都有不同的过滤器计数和类型,但每个过滤器都有一个唯一的字符串 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
}

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

foreach (var f in filters)
    query.Where(p => p.Field == p.field).AndValueNotIn(f.values);

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

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

.FromSqlInterpolated($"EXEC GetGroupFilters {groupId}").AsEnumerable()

MSSql 过程有唯一的 SQL(join、select、union),并从我加载到 Object 并使用 LINQ 的 DB 中返回格式化的行,我有 2 个选择:

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

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

有没有更好的解决方案?

【问题讨论】:

  • 推荐看here
  • 这真的很广泛。提供和规范输入的类型和含义。
  • @AluanHaddad 我在原始问题中添加了更多信息。
  • 你可以简单地链接Wheres:query.Where(...).Where(...).Where(...)。关于如何在运行时编写过滤查询有很多问题。
  • 链接Where 语句是您想要的。这很简单。您可以使用谓词构建器构建谓词。这些都是之前已经讲过很多次的东西了。

标签: c# asp.net reactjs entity-framework-core


【解决方案1】:

其实我也做过这样的事情

我建议您通过以下链接了解 Linq.Expression 中的 表达式树 在您可以在此 link 中找到您的问题答案之前,我实施了此操作

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

     // 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);

对不起我的英语不好希望它能帮助你

【讨论】:

  • 这个示例代码不是你想要的,但它有你想要的概念。
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多