【问题标题】:Dynamic filter with LINQ (EntityFramework)使用 LINQ 的动态过滤器(EntityFramework)
【发布时间】:2019-11-27 00:36:12
【问题描述】:

问题很简单。我们有一些商店有很多产品。 例如,每个项目都有字段(以及许多其他字段):

  • 身高
  • 重量
  • 长度
  • 姓名
  • 颜色
  • 价格

我们实现了一些页面,我们可以在其中按数字(如价格、长度)和字符串(颜色)的范围过滤项目。

所以,问题就在这里: - 我们需要允许人们按照上述任何标准(颜色+价格、颜色+长度+重量)过滤商品。

预定义的 SELECT+WHERE 的基本方法太难主。

还有其他选择吗?

谢谢。

【问题讨论】:

  • 请贴一些代码...

标签: asp.net sql-server entity-framework linq asp.net-core


【解决方案1】:

乔纳森是对的。我认为使用 if 案例会最简单,看起来像这样。

var res = _dbContextorSource.table.Where(x => x.ID > 0); //something to get all of them
//or (x => x.ID >= 0 && x.ID <= 50) if you're showing 50 on a page

if(FirstFilterIsUsed){
 res = res.table.Where(x => x.FirstField == FirstFilter);
}

if(SecondFilterIsUsed){
 res = res.table.Where(x => x.SecondField == SecondFilter);
}

//etc

我认为您可以实现一个更干净的解决方案,循环通过每个过滤器。这是超级伪的,但我使用过这样的解决方案。

var filters = GetUserFilters();
foreach(Filter filter in filters){
 res = res.table.Where(x => x.GetType().
  GetProperty(filter.MatchingName).GetValue(x) == filter.FilterValue);
}
var result = res.ToList();

【讨论】:

    【解决方案2】:

    常用解决方案

    最常见的解决方案是执行一个大的 if` 案例。支持您的所有领域需要一些时间,但最终会很好。

    但是,如果您想动态执行此操作,2 个第三方库可以帮助您完成此操作


    LINQ 动态

    https://www.nuget.org/packages/System.Linq.Dynamic.Core/

    所需的语法与 C# 略有不同,但效果很好。它是做这种事情的最受欢迎的图书馆。


    C# 评估表达式

    免责声明:我是项目的所有者C# Eval Expression

    该库不是免费的,但您几乎可以使用与 C# 相同的语法来执行任何动态 LINQ。

    因此,您将能够构建一个字符串进行评估,而库将为您完成剩下的工作。

    以下是一些使用 EF Classic 的示例:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多