如何为LINQ中的每组产品创建一个动态的过滤器组

时间:2018-09-18 09:37:52

标签: c# asp.net-mvc linq linq-to-entities

我有一组产品,每个组都有一组 FILTER ATTRIBUTE ,并且每个组的动态情况现在我都希望用户可以为每个组选择多个过滤器例如,选择2个品牌和3个颜色的品牌和颜色组本身是2个品牌的并集,而3个颜色应该是并集的,但是这两个滤镜组的组合应相交

我找到了解决方案,但我认为是业余的

for (var i = 0; i < filtA.Length; i++)
                    {
                        eachfiltGrp = filtA[i].Split('G');
                        eachfilt = eachfiltGrp[1].Split('A');

                        if (eachfilt.Length == 1)
                        {
                            var filter0 = Convert.ToInt32(eachfilt[0]);
                            products = products.Include(p => p.Product_Attribut).Where(x => x.Product_Attribut.Any(p => p.AttributeID == filter0));

                        }
                        else if (eachfilt.Length == 2)
                        {
                            var filter0 = Convert.ToInt32(eachfilt[0]);
                            var filter1 = Convert.ToInt32(eachfilt[1]);
                            products = products.Include(p => p.Product_Attribut).Where(x => x.Product_Attribut.Any(p => p.AttributeID == filter0 || p.AttributeID == filter1));
                        }
                        else if (eachfilt.Length == 3)
                        {
                            var filter0 = Convert.ToInt32(eachfilt[0]);
                            var filter1 = Convert.ToInt32(eachfilt[1]);
                            var filter2 = Convert.ToInt32(eachfilt[2]);
                            products = products.Include(p => p.Product_Attribut).Where(x => x.Product_Attribut.Any(p => p.AttributeID == filter0 || p.AttributeID == filter1 || p.AttributeID == filter2));
                        }  

这可以完美地工作,但是仅适用于3组过滤器,更多的话我应该写更多的条件 这里的 filterA 具有字符串,其中包括发送给控制器的所有过滤器和每个组ID,以及由 G 分割的过滤器和由 A 分割的组的每个过滤器不是动态的

现在我以此更改这些行,听起来应该可以工作

   var products = db.Products.Include(p => p.Product_Groups);


    for (var i = 0; i < filtA.Length; i++)
                        {
                            eachfiltGrp = filtA[i].Split('G');
                            eachfilt = eachfiltGrp[1].Split('A');
                            products = Products.Where(p => p.Product_Attribut.Any(x => eachfilt.Contains(x.AttributeID.ToString())));

                         }

这很好,但仅用于最后一个循环,这意味着发送给控制器的最后一个过滤器组对产品产生影响,而对其余部分没有影响

对此有何建议?

0 个答案:

没有答案