我正在使用ASP.net Web Service C#.net3.5并使用LINQ TO SQL来操作SQL DataBase
我希望从Countries
表中返回所有国家/地区的信息,
所以我写了一个返回一个对象List的web方法,每个对象都有两个数据字段Country_Id
,Country_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;
}
但是当我运行代码时,我得到一个包含相同Object的List,并且该对象具有从最后一轮Foreach获取的值。
我尝试以下内容:
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;
}
我得到了我想要的&gt;&gt;为什么????
答案 0 :(得分:3)
这两个循环做了很多不同的事情:
在第一个示例中,您只创建一个对象/然后每次循环,修改同一个对象,然后将其重新添加到列表中。因此,您的列表包含一堆对同一对象的引用,一遍又一遍。
这是因为CountryObject
,就像所有类都是引用类型一样。当您将实例添加到TempList
时,您只是添加对该实例的引用,而不是它的副本,因此当您稍后修改实例时,这些更改将反映在列表中,因为它只有一个引用相同的实例。
在第二个示例中,在每次迭代时创建一个新对象,并将新创建的对象添加到循环中。
因为您每次都在创建一个新实例,所以列表引用的实例不会被修改。
进一步阅读
答案 1 :(得分:2)
您的第一个代码段仅创建一个您多次放入列表的对象。第二个在foreach
循环的每次迭代中创建一个。
另一方面,我建议您将CountryObject
更改为Id
和Name
属性,并且您不需要在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();
}