问题很简单。我们的商店里有很多产品。 例如,每个项目都有字段(以及许多其他字段):
我们实现了一些页面,可以在其中按数字(例如价格,长度)和字符串(颜色)的范围过滤项目。
因此,问题出在这里: -我们需要允许人们按照以上任意条件(颜色+价格,颜色+长度+重量)过滤商品。
使用预定义的SELECT + WHERE的基本方法很难维护。
还有其他选择吗?
谢谢。
答案 0 :(得分:0)
最常见的解决方案是执行if案例。支持您的所有领域都需要花费一些时间,但最终效果会很好。
但是,如果您想动态地进行操作,则2个第三方库可以为您提供帮助
https://www.nuget.org/packages/System.Linq.Dynamic.Core/
所需的语法与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();