2013-07-13 79 views
1

我與ASP.net Web服務C#.NET3.5的工作,並使用LINQ to SQL中使用SQL數據庫返回一個包含相同的對象

操縱名單,我想返回所有的國家信息從Countries表, 所以我寫了一個Web方法返回對象的列表,每個對象有兩個數據字段Country_IdCountry_Name這裏是方法:

public List<CountryObject> ReturnAllCountries() 
{ 
    ProjectTwoDataBaseDataContext DataBase = new ProjectTwoDataBaseDataContext(); 
    var Country = from a in DataBase.Countries 
        select new {a.Country_Id,a.Country_Name }; 
    CountryObject TempObject = new CountryObject(); 
    List<CountryObject> TempList = new List<CountryObject>(); 
    foreach (var a in Country) 
    { 
     TempObject.setCountry_Id(a.Country_Id); 
     TempObject.setCountry_Name(a.Country_Name); 
     TempList.Add(TempObject); 
    } 
    return TempList; 

} 

但是當我運行的代碼,我得到一個List包含相同的對象,並且這個對象具有從上一輪Fo獲得的值達到。

我嘗試以下方法:

public List<CountryObject> ReturnAllCountries() 
{ 
    ProjectTwoDataBaseDataContext DataBase = new ProjectTwoDataBaseDataContext(); 
    var Country = from a in DataBase.Countries 
        select new {a.Country_Id,a.Country_Name }; 
    CountryObject TempObject; 
    List<CountryObject> TempList = new List<CountryObject>(); 
    foreach (var a in Country) 
    { 
     TempObject = new CountryObject(); 
     TempObject.setCountry_Id(a.Country_Id); 
     TempObject.setCountry_Name(a.Country_Name); 
     TempList.Add(TempObject); 
    } 
    return TempList; 

} 

,我得到了我想要什麼>>爲什麼????

回答

3

兩個循環做完全不同的事情:

  1. 在第一個例子,你只能通過一個對象/那麼每次創建,修改同一個對象,然後將其重新添加到列表。所以你的列表一次又一次地包含了一堆對同一個對象的引用。

    這是因爲CountryObject,像所有的類是引用類型。將實例添加到TempList時,您只是添加對該實例的引用,而不是它的副本,因此當您稍後修改實例時,這些更改將反映在列表中,因爲它只引用相同的實例。

  2. 在第二個示例中,在每次迭代中創建一個新對象,並將該新創建的對象添加到循環中。

    因爲您每次都創建一個新實例,所以列表引用的實例不會被修改。

進一步閱讀

2

你的第一個代碼段僅創建一個你投入列表多次一個對象。第二個循環創建一個迭代循環。

在另一方面,我建議改變CountryObjectIdName特性,你就不需要在Linq查詢使用匿名類。屬性優於get和set方法。

public class CountryObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public List<CountryObject> ReturnAllCountries() 
{ 
    ProjectTwoDataBaseDataContext DataBase = new ProjectTwoDataBaseDataContext(); 
    var Country = from a in DataBase.Countries 
        select new CountryObject{Id=a.Country_Id, Name=a.Country_Name }; 
    return Coutry.ToList(); 
} 
相關問題