是否可以使用 Linq 从数据读取器设置列表<对象>的属性
本文关键字:列表 对象 属性 设置 可以使 Linq 读取 数据 是否 | 更新日期: 2023-09-27 18:37:28
例如,假设我有一个List<Person>
,每个人都有十几个属性。前十个属性都是在生成列表时设置的。
稍后我需要填充列表中每个项目的最后两个属性的数据。
我有一个返回 PersonId、Property11、Property12 的存储过程,我想使用 Linq 从IDataReader
中获取值,并从列表中填充正确Person
上的值,显然在 PersonId 上匹配。
从这样的东西开始:(这不是我正在使用的实际代码,但结构是相似的。
public void GetAdditionalProps( List<IPersonData> people)
{
var peopleIds = String.Join( ",", people.Select(x => x.ID));
using (var conn = Database.GetConnection(Database.PeopleDB))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "spGetPeopleData" ;
cmd.CommandType = CommandType.StoredProcedure;
cmd.AddParameterWithValue( "@Ids" , peopleIds);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var pd = people.First(p => p.ID.Equals(reader["PersonId" ]));
pd.HairColor = reader["HairColor" ].ToString();
pd.EyeColor = reader["EyeColor" ].ToString();
}
}
}
}
}
但我想知道我是否可以使用 Linq 填充每个列表项的数据,而不必单独查找每个列表项?
你可以做这样的事情...
虽然这里没有太多使用"强迫"林克......
也许加入比每次调用 First() 都快......
public Tuple<int,string,string> GetAdditionalData(List<IPersonData> people)
{
string peopleIds = String.Join( ",", people.Select(x => x.ID));
using (var conn = Database.GetConnection(Database.PeopleDB))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "spGetPeopleData" ;
cmd.CommandType = CommandType.StoredProcedure;
cmd.AddParameterWithValue( "@Ids" , peopleIds);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
yield return new Tuple<int,string,string>(
reader["PersonId" ],
reader["HairColor" ],
reader["EyeColor" ]);
}
}
}
}
}
public void Enrich(List<IPersonData> people)
{
var dataToEnrich = from person in people
join additional in GetAdditionalData(people)
on additional.Item1 equals person.ID
select new { Person = person,
HairColor = additional.Item2,
EyeColor = additional.Item3 };
foreach(var enrichment in dataToEnrich)
{
enrichment.Person.HairColor = enrichment.HairColor;
enrichment.Person.EyeColor = enrichment.EyeColor ;
}
}