基于组合框值C#动态生成xml-to-linq查询过滤器

时间:2011-06-07 07:28:52

标签: c# xml linq-to-xml

我得到了一个包含多个组合框的表单,其中每个组合框可以设置为不同的值。基于组合框值,我想创建一个查询过滤器。我想迭代所有组合框并将其值添加到过滤器中,如果它不说“全部”。

我想做这样的事情:

    XElement root = XElement.Load(fileName);
                    IEnumerable<XElement> selectedElements =
                        from el in root.Elements("OrderNum").Elements("ServiceJob")
                        where
                            for(int i = 0; i < combArray.GetLength(0); i++)
                            {
                                if(combArray[i].Text != "All")
                                {
                                    (string)el.Element(combArray[i].AccessibleName) == combArray[i].Text &&
                                }
                            }
                        select el;

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

这样的事情:

IEnumerable<XElement> query = root.Elements("OrderNum").Elements("ServiceJob");
for(int i = 0; i < combArray.GetLength(0); i++)
{
    if(combArray[i].Text != "All")
        query = query.Where(arg => arg.Element(combArray[i].AccessibleName) == combArray[i].Text)
}
var result = query.ToList();

答案 1 :(得分:0)

您可以按如下方式动态添加Where子句:

XElement root = XElement.Load(fileName);
IEnumerable<XElement> selectedElements = root.Elements("OrderNum").Elements("ServiceJob");

for(int i = 0; i < combArray.GetLength(0); i++)
{
    if(combArray[i].Text != "All")
    {
        selectedElements = selectedElements.Where(el => el.Element(combArray[i].AccessibleName) == combArray[i].Text);
    }
}

var result = selectedElements.ToList();

for循环的每次迭代,都采用前一个查询并附加一个合适的Where子句。

对于“奖励积分”,您可以使用Linq简化您的for循环:

var comboBoxes = combArray.Where(c => c.Text != "All");
foreach(var comboBox in comboBoxes)
{
    selectedElements = selectedElements.Where(el => el.Element(comboBox .AccessibleName) == comboBox .Text);
}