2011-05-25 37 views
2

我還是LINQ的新手。是否有可能做到以下幾點:直接從linq查詢返回一個類

例如,我有一個類:

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

現在我想通過閱讀,比方說,一個XML文件的內容並將其返回到它返回一個類對象。

所以,如果我讀這 xml文件:

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

書的人(說這屬於人民類):

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

對不起,如果這是一個愚蠢的問題。

感謝

+0

如果p.FirstName拋出的NullReferenceException並不意味着LINQ返回一個空的類,它也可以返回null。嘗試檢查p爲空,並請發送堆棧跟蹤。 – 2011-05-25 07:29:28

回答

4

你需要閱讀項目的序列和閱讀項目區別開來。目前在ReadPerson中的person變量實際上是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元素,或多發生什麼個人元素。 FirstFirstOrDefault,SingleSingleOrDefault方法將在這裏對你有用。

2

從我如何讀它,你需要的是:

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

這解決:

  • 返回多個後裔
  • 姓的問題的問題/姓氏不是指定

如果您意圖在那裏只能是一個,然後使用Single()/First()/SingleOrDefault()/FirstOrDefault()

0

我看到問題了! ReadPerson方法中的person不是Person類的實例,但是集合(IEnumerable<Person>)和鑄造到Person返回null

0

以下行具有無效的轉換問題。您應該讓編譯器來幫助您(請參閱我的修改函數)。

return person as Person; 

您應該返回一個人員列表而不是一個人。如果您確信xml中只有一個人,您可以調用Single()而不是ToList()。

public static List<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 
        });*/ 
    List<Person> persons = (from p in xd.Descendants("person") 
        select new Person 
        { 
         FirstName = p.Element("firstname").value, 
         LastName = p.Element("lastname").value 
        }).ToList(); 
    return persons; 
}