我的LINQ查询仅返回1个结果

3

我的 LINQ 查询只返回第一个结果(Class)。这是我使用的代码:

        XDocument xmlDoc = XDocument.Load("Decks/Test.xml");
        List<Cards> tempdeck = (from deck in xmlDoc.Elements("Deck")
                                select new Cards
                                 {
                                     Name = deck.Element("Type").Value

                                 }).ToList<Cards>();

        foreach (var item in tempdeck)
        {
            ((MessageBroker)App.Current.Resources["MessageBroker"]).GameLog.Add(item.Name.ToString());

        }

这是我的XML文件的样子:
<Deck>
  <Type>
    <Name>Class</Name>
  </Type>
  <Type>
    <Name>stsfs</Name>
  </Type>
  <Type>
    <Name>Class</Name>
  </Type>
  <Type>
      <Name>Class</Name>
    </Type>
</Deck>

我这样格式化它是因为当我让它工作时,我想向查询添加多个属性 - 不仅仅是名称。

提前感谢!

2个回答

3
你的示例并不清晰,但是看起来你有一个 Deck 元素,它有多个 Type 子元素。你的代码却假设相反,即有多个 Deck,每个 Deck 只有一个(或一个感兴趣的)type-child。
试试这个改进方案:
( from type in xmlDoc.Element("Deck").Elements("Type")
  select new Cards { Name = type.Value }
).ToList()

每个唯一卡组的类型子元素都会生成一个“卡片”。
如果您有多个卡组,请参考Mark Cidade的答案。

谢谢Ani - 这解决了我的问题!我不明白为什么要使用Mark Cidade的答案。你们两个能否进一步向我解释一下?我猜这会很有用。还有一个问题 - 我有一个类型,它期望一个INT而不是一个字符串。我认为这个格式:Usage = (int)deck.Element("Usage").Value 是它所期望的,但我得到了“无法将类型字符串转换为int”的错误。我该怎么办才能解决这个问题? - Stacey
@Stacey:关于转换类型,尝试使用(int)deck.Element("Usage")。XElement有一个显式的转换运算符到int(和其他常见类型)。它的“Value”属性返回一个System.String,不是int类型。关于Mark的答案,它获取所有牌组的类型子元素。如果您有多个牌组并且正在尝试从所有牌组中组装一个“cardses”序列,那么这就是正确的方法。它可以转换为一个“SelectMany”调用。 - Ani
谢谢 - 这解决了我的转换问题。 :) 另外,这个解释帮了我很多。我很感激! - Stacey

1
在您的查询中,您只选择了单个Deck元素,然后选择了第一个Type元素。您需要从每个Type元素中进行选择:
    List<Cards> tempdeck = (from deck in xmlDoc.Elements("Deck")
                            from type in deck.Elements("Type")
                            select new Cards
                             {
                                 Name = type.Value

                             }).ToList<Cards>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接