c# - 直接从 linq 查询返回类

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

我对 LINQ 还很陌生。是否可以执行以下操作:

例如,我有一个类:

public class Person
{
        public string FirstName { get; set; }
        public string LastName { get; set; }
}

现在我想通过读取 xml 文件的内容并将其返回,将其作为类对象返回。

所以如果我读到这篇文章 xml 文件:

<person>
    <firstname></firstname>
    <lastname></lastname>
</person>

读取 Person(假设它属于 People 类):

public static Person ReadPerson(xmlpath)
{
    XDocument xd = XDocument.Load(xmlpath);
    var person = (from p in xd.Descendants("person")
                  select new Person
                  {
                      FirstName = p.Element("firstname").value,
                      LastName = p.Element("lastname").value
                  });
    return person as Person;
}

现在,如果我在其他地方执行以下操作:

Person p = new Person();
p = People.Person(xmlpath);
Response.Write(p.FirstName);

此处,p.FirstName 返回空异常。我的理解是因为 linq 查询返回了一个空类。

所以我的问题是,是否可以直接将内容添加到查询中的类中并返回它而不运行 foreach 循环并手动添加所有内容? (如下所示:)

Person p = new Person();
foreach (var x in person)
{
    p.FirstName = x.FirstName;
    p.LastName = x.LastName;
}

抱歉,如果这是一个愚蠢的问题。

谢谢

最佳答案

您需要区分读取序列项目和读取单个项目。目前person变量 ReadPerson实际上是 IEnumerable<Person> 类型- 你回来了person as Person这将为空,因为该序列实际上不是 Person 的实例。如果您使用强制转换而不是 as ,您之前就已经看到了这一点 - 但您必须对类型执行任何操作这一事实应该是一个警告,表明您没有做正确的事情。

我怀疑你实际上想要这个:

public static IEnumerable<Person> ReadPeople(xmlpath)
{
    XDocument xd = XDocument.Load(xmlpath);
    return from p in xd.Descendants("person")
           select new Person
           {
               FirstName = p.Element("firstname").value,
               LastName = p.Element("lastname").value
           });
}

或者这个:

public static Person ReadPerson(xmlpath)
{
    XDocument xd = XDocument.Load(xmlpath);
    XElement element = xd.Descendants("person").First();
    return new Person
           {
               FirstName = element.Element("firstname").value,
               LastName = element.Element("lastname").value
           });
}

您还应该考虑如果没有,您希望发生什么 person元素,或多个人物元素。 First , FirstOrDefault , SingleSingleOrDefault方法在这里对您有用。

关于c# - 直接从 linq 查询返回类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6120894/

相关文章:

C# 过滤器列表删除任何双对象

c# - Linq Contains() 是否检查 HashSet?

asp.net - 导出Excel前添加标题

.net - 使用 MemoryStream 保存 .docx 文件 C#

c# - 单元测试简单的树结构操作

c# - 这是处理 SQLConnection 的正确方法吗

c# - 我的 C# 和 PHP 解密方法有何不同?

c# - OOP:理解抽象

c# - 为什么 MongoDB 中的多个 session 比一个 session 更快?

c# - 如何更新 Entity Framework 中的多对多表