簡體   English   中英

C#LINQ到XML動態查詢

[英]c# linq to xml dynamic query

是的,有點奇怪的問題; 我最近一直在對XML工作做一些linq(請參閱此處此處的其他近期帖子)。

基本上,我希望能夠創建一個查詢來檢查文本框的值是否包含在查詢中之前,是否為null,如下所示:

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

只需使用普通的布爾運算符&&和||:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM