【问题标题】:Linq to XML - Weird where resultsLinq to XML - 结果很奇怪
【发布时间】:2009-06-23 20:59:31
【问题描述】:

我是 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>

然后我得到两个场景返回。

我做错了什么?

谢谢大家。

【问题讨论】:

  • 您是要获取包​​含特定艺术家的“电影”还是包含特定艺术家的“场景”?
  • 你好 orandov,正在尝试获取包含特定艺术家的“场景”。谢谢。

标签: xml vb.net linq linq-to-xml


【解决方案1】:

为了格式化,我将把它作为一个单独的答案发布:

这是 Jon 使用 this site 转换为 VB.Net 的答案。

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

【讨论】:

  • 谢谢 orandov,它运行良好。我将 Jon 的答案标记为正确。仍然感谢您的帮助。
【解决方案2】:

好吧,恐怕我不知道 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,我的 C# 技能很差,我还是会尝试将您的解决方案转换为 vb.net,感谢 Jon 的帮助。
【解决方案3】:

乔恩斯答案的另一种选择是使用多选(多选)

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

【讨论】:

  • 谢谢我也应该这样测试。
猜你喜欢
  • 1970-01-01
  • 2016-08-14
  • 2016-05-03
  • 2018-03-11
  • 2013-11-03
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多