2010-04-14 75 views
0

對,有點奇怪的問題;最近我一直在做一些LINQ到XML工作(請參閱我的其他近期帖子herehere)。c#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

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

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,你真的不想要轉換012我敢肯定,每次迭代都會有。您還需要將「名稱」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(); 
+0

神奇再次喬恩。正如你在第二個選項中提到的那樣,我已經列出了一些值,只是使用上面的代碼來使事情變得更簡單。再一次非常感謝你! – 2010-04-14 08:55:10