2010-04-14 84 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