c # linq to xml динамический запрос - PullRequest
0 голосов
/ 14 апреля 2010

Да, немного странный вопрос; Недавно я работал над linq to XML (см. Мои другие последние посты здесь и здесь ).

По сути, я хочу иметь возможность создавать запрос, который проверяет, является ли текстовое поле нулевым, прежде чем его значение будет включено в запрос, например:

XDocument db = XDocument.Load(xmlPath);
var query = (from vals in db.Descendants("Customer")
            where (if(textbox1.Text != "") {vals.Element("CustomerID") == Convert.ToInt32(textbox1.Text) } || 
                  if(textbox2.Text != "") {vals.Element("Name") == textbox2.Text})
            select vals).ToList();

1 Ответ

1 голос
/ 14 апреля 2010

Просто используйте обычные логические операторы && и ||:

XDocument db = XDocument.Load(xmlPath);
var query = (from vals in db.Descendants("Customer")
            where (textbox1.Text != "" && 
               vals.Element("CustomerID") == Convert.ToInt32(textbox1.Text)) || 
               (textbox2.Text != "" && vals.Element("Name") == textbox2.Text)
            select vals).ToList();

Это просто прямой перевод исходного кода - но я думаю, что вы захотите приведение от vals.Element("CustomerID") до int, и вы не хотите конвертировать textbox1.Text на каждой итерации, я конечно. Вам также необходимо преобразовать «имя» XElement в строку. Как насчет этого:

int? customerId = null;
if (textbox1.Text != "")
{
    customerId = int.Parse(textbox1.Text);
}

XDocument db = XDocument.Load(xmlPath);
var query = (from vals in db.Descendants("Customer")
             where (customerId != null && 
                (int) vals.Element("CustomerID") == customerId) ||
                (textbox2.Text != "" && 
                 (string) vals.Element("Name") == textbox2.Text)
             select vals).ToList();

В качестве альтернативы, вы можете разделить две части запроса и «объединить» результаты вместе. Или - желательно IMO - вы можете построить запрос более динамично:

var query = db.Descendants("Customer");
if (textbox1.Text != null)
{
    int customerId = int.Parse(textbox1.Text);
    query = query.Where(x => (int) x.Element("CustomerID") == customerId);
}

if (textbox2.Text != null)
{
    query = query.Where(x => (string) x.Element("Name") == textbox2.Text);
}
List<XElement> results = query.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...