LINQ查询获取两条记录的总线号

时间:2014-08-12 08:16:10

标签: c# xml linq

这是我的表格样本

Busnumber   st1  st2    st3     st4     st5     st6
1           abc  xyz    hvh     cdff    dfds    dfds
2           abc  efg    vv      vhv     cfg     vvv
3           uyt  ggg    xyz     hhh     saa     pok
4           uyr  abc    xyz     iii     ppp     wer

我想选择所有有两个电台的总线号码" abc"和" xyz"在这里,我想要的输出是总数1和4

那么如何在windows手机中使用c#在xml到linq查询中实现这一点# 我正在尝试下面的代码

XDocument loadedCustomData = XDocument.Load("best.xml");
        var filteredData =
           from c in loadedCustomData.Descendants("record")
           ///what to do below here in were clause statement ??????
          where (string)c.Element ("st1") == froms.Text && (string)c.Element("st2") == to.Text ..........

           select new words()
           {
               Busnumber = (string)c.Element("bus")

           };
        listBox1.ItemsSource = filteredData;

我的xml示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<record>
    <Busnumber>1</Busnumber>
    <st1>Santacruz Depot</st1>
    <st2>abc</st2>
    <st3>Vile Parle</st3>
    <st4>Mithibai College</st4>
    <st5>xyz</st5>
    <st6>Juhu Shopping Centre</st6>
</record>
<record>
    .......
</record>

1 个答案:

答案 0 :(得分:1)

您可以使用此主题中解释的技巧:Determine if a sequence contains all elements of another sequence using Linq

使用相同的方法检查<record>的孩子列表是否包含您要检查的所有条件。在您的情况下实施是这样的:

var criteriaArray = new string[]{ "abc", "xyz" };
var filteredData = 
        from c in Busnumber.Descendants("record")
        where !criteriaArray.Except(c.Elements().Select(o => (string)o))
                            .Any() 
        select new
        {
           Busnumber = (string)c.Element("Busnumber")
        };

您可能希望更改where子句以仅检查以&#34; st&#34;开头的子元素。 :

where !criteriaArray.Except(c.Elements()
                             .Where(o => o.Name.LocalName.StartsWith("st"))
                             .Select(o => (string)o))
                    .Any() 

更新:

我试着解释一下,我假设你已经仔细阅读了我上面链接的问题。此代码段subset.Except(superset).Any()检查子集是否包含超集中未包含的元素。

因此,这个!subset.Except(superset).Any()检查子集是否包含不包含在超集中的元素。换句话说,子集仅包含也包含在超集中的元素。换句话说,超集包含子集的所有元素。所以这就是你想要的;检查记录节点(超集)的子节点是否包含criteriaArray(子集)的所有成员。