динамически генерировать фильтр запросов xml-to-linq на основе значения выпадающего списка C # - PullRequest
0 голосов
/ 07 июня 2011

Я получил форму с несколькими выпадающими списками, в которой для каждого выпадающего списка можно установить разные значения. Основываясь на значении в выпадающем списке, я хочу создать фильтр запросов. Я хочу перебрать все выпадающие списки и добавить его значение в фильтр, если он не говорит «Все».

Я хочу сделать что-то вроде этого:

    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 голосов
/ 07 июня 2011

Вы можете просто динамически добавлять предложения 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.

Для 'бонусных баллов'Вы можете упростить цикл for, используя Linq:

var comboBoxes = combArray.Where(c => c.Text != "All");
foreach(var comboBox in comboBoxes)
{
    selectedElements = selectedElements.Where(el => el.Element(comboBox .AccessibleName) == comboBox .Text);
}
0 голосов
/ 07 июня 2011

Примерно так:

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();
...