【问题标题】:c# linq to xml dynamic queryc# linq to xml动态查询
【发布时间】:2010-04-14 16:49:11
【问题描述】:

对,有点奇怪的问题;我最近一直在做一些 linq to XML 工作(请参阅我最近的其他帖子 herehere)。

基本上,我希望能够创建一个查询,在文本框的值包含在查询中之前检查它是否为空,如下所示:

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

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案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,并且您真的不想在每次迭代时转换 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();
    

    【讨论】:

    • 再次棒极了乔恩。正如您在第二个选项中提到的那样,我已经使用了值,只是使用上面的代码使事情变得更简单。再次非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多