使用LINQ的动态过滤器(EntityFramework)

时间:2019-07-18 06:32:51

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

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

  • 高度
  • 重量
  • 长度
  • 名称
  • 颜色
  • 价格

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

因此,问题出在这里: -我们需要允许人们按照以上任意条件(颜色+价格,颜色+长度+重量)过滤商品。

使用预定义的SELECT + WHERE的基本方法很难维护。

还有其他选择吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

通用解决方案

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

但是,如果您想动态地进行操作,则2个第三方库可以为您提供帮助


LINQ动态

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

所需的语法与C#稍有不同,但效果很好。这是最受欢迎的图书馆。


C#评估表达式

免责声明:我是项目C# Eval Expression

的所有者

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

因此,您将能够构建要评估的字符串,而库将为您完成其余工作。

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

答案 1 :(得分:0)

乔纳森是正确的。我认为使用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();