Linq到XML-奇怪的结果在哪里

Linq到XML-奇怪的结果在哪里,xml,vb.net,linq,linq-to-xml,Xml,Vb.net,Linq,Linq To Xml,我是Linq新手,当我尝试使用where执行查询时,会得到一些奇怪的结果 xml的示例: <movies> <movie id="1"> <scenes> <scene id="1"> <sceneartistsnames> <sceneartistname>Artist A</sceneartistname&g

我是Linq新手,当我尝试使用where执行查询时,会得到一些奇怪的结果

xml的示例:

    <movies>
      <movie id="1">
        <scenes>
          <scene id="1">
            <sceneartistsnames>
              <sceneartistname>Artist A</sceneartistname>
            </sceneartistsnames>
          </scene>
          <scene id="2">
            <sceneartistsnames>
              <sceneartistname>Artist B</sceneartistname>
            </sceneartistsnames>
          </scene>
        </scenes>
      </movie>
      <movie id="10">
        <scenes>
          <scene id="1">
            <sceneartistsnames>
              <sceneartistname>Artist B</sceneartistname>
              <sceneartistname>Artist A</sceneartistname>
            </sceneartistsnames>
          </scene>
        </scenes>
      </movie>
    </movies>
现在尝试选择艺术家A参与的所有场景

Dim Results = From MovieWithArtist In MoviesXML...<scene> _
              Where MovieWithArtist.<sceneartistsnames>.<sceneartistname>.Value = "Artist A" _
              Select MovieWithArtist
我只得到一个场景返回,我期待着两个

现在,如果我将XML中的第二个场景更改为:

<movie id="10">
        <scenes>
          <scene id="1">
            <sceneartistsnames>
              <sceneartistname>Artist A</sceneartistname>
              <sceneartistname>Artist B</sceneartistname>
            </sceneartistsnames>
          </scene>
        </scenes>
      </movie>
然后我得到两个场景返回

我做错了什么


谢谢大家。

恐怕我不知道VB.NET XML语法,但是这个C很好用:

static void Main()
{
    XDocument doc = XDocument.Load("movies.xml");

    var query = doc.Descendants("scene")
                   .Where(scene => scene.Elements("sceneartistsnames")
                                        .Elements("sceneartistname")
                                        .Any(name => name.Value == "Artist A"));

    foreach (var scene in query)
    {
        Console.WriteLine(scene);
    }
}

将其转换为对LINQ扩展方法的VB.NET调用应该不难,但恐怕您需要其他人来处理Jared?帮助使用XML特定语法。

Jon回答的另一个替代方法是使用selectmany-multiplefrom

  var qry = from x in xe.Descendants("scene")
            from s in x.Descendants("sceneartistname")
            where (string)s == "Artist A"
            select string.Format("Movie ID {0} Scene ID {1} : {2}", (int)x.Parent.Parent.Attribute("id"), (int)x.Attribute("id"), (string)s);

为了便于格式化,我将此作为单独的答案发布:

这是Jon的答案,使用转换为VB.Net


你是在尝试拍摄有特定艺术家的电影还是有特定艺术家的场景?你好,奥兰多夫,正在尝试拍摄有特定艺术家的场景。谢谢。谢谢Jon,我的C语言技能很差,但我会尝试将你的解决方案转换为vb.net,谢谢Jon的帮助。谢谢orandov,它工作得很好。我记下乔恩的答案是正确的。还是要谢谢你的帮助。谢谢你。我也应该用这种方式测试。
Private Shared Sub Main()
     Dim doc As XDocument = XDocument.Load("movies.xml")

  Dim query = doc.Descendants("scene").Where(Function(scene) scene.Elements("sceneartistsnames").Elements("sceneartistname").Any(Function(name) name.Value = "Artist A"))

     For Each scene In query
         Console.WriteLine(scene)
     Next
    End Sub