Asp.net 使用LINQ以动态方式过滤产品

Asp.net 使用LINQ以动态方式过滤产品,asp.net,linq,dictionary,code-behind,dynamicquery,Asp.net,Linq,Dictionary,Code Behind,Dynamicquery,经过几个小时的努力和探索,我想现在是时候和你们分享我的问题了 问题定义: 我有一个键值对的字典(名为filterPool),其中包括一个整数(PropertyID)和一个字符串(McValue)。我试图做的是根据这些KeyValuePairs过滤产品,并将它们作为数据表/列表返回。 您可以将此视为将动态的“何处……和…”子句建立为SQL.< /P> 以下是我正在使用的代码: foreach (KeyValuePair<int, string> filter i

经过几个小时的努力和探索,我想现在是时候和你们分享我的问题了

问题定义: 我有一个键值对的字典(名为filterPool),其中包括一个整数(PropertyID)和一个字符串(McValue)。我试图做的是根据这些KeyValuePairs过滤产品,并将它们作为数据表/列表返回。 您可以将此视为将动态的“何处……和…”子句建立为SQL.< /P> 以下是我正在使用的代码:

            foreach (KeyValuePair<int, string> filter in filterPool)
            {
                products = products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value));
            }
            return products.ToDataTable();                  
foreach(filterPool中的KeyValuePair筛选器)
{
products=products.Where(i=>i.PROPERTYID==filter.Key&&i.MCVALUE.Equals(filter.Value));
}
返回产品。ToDataTable();
问题在于,对于字典中最新的KeyValuePair,上面的foreach循环似乎只工作一次

就我在Stackoverflow上所能找到的最接近我问题的解决方案是:

必须有一种方法来实现使用字典和LINQ进行过滤的目标;或者有一个巨大的东西,我不知怎的错过了/忽略了去看

希望给出的问题对所有人都足够清楚, 谢谢
^^这是一个关闭问题。您可以通过创建临时解决方案来解决此问题:

        foreach (KeyValuePair<int, string> filterTmp in filterPool)
        {
            var filter = filterTmp; // Make a temporary
            products = products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value));
        }
        return products.ToDataTable();   
foreach(filterPool中的KeyValuePair FilterTemp)
{
var filter=filterTmp;//创建临时
products=products.Where(i=>i.PROPERTYID==filter.Key&&i.MCVALUE.Equals(filter.Value));
}
返回产品。ToDataTable();
有关正在发生的事情的详细信息,请参阅Eric Lippert的帖子


还要注意的是,C#5的这种行为已经改变。在C#5/VS2012中,此代码将按预期工作。

您在foreach的每次迭代中都会覆盖产品集合。我不确定集合上的数据类型是什么,但您希望在foreach中执行类似的操作:

products.AddRange(products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value)));

我不确定这是否有意义,但似乎您正在尝试创建一个与您的filterPool匹配的产品集合。

我认为最好使用聚合:

return filter
    .Aggregate(products, (acc, filter) => acc.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value)));
    .ToDataTable();

感谢Reed,由于远程SQL Server的连接问题,我现在无法尝试您的解决方案建议。我会尽快试一试的!再次感谢您的快速回复。