是否可以使用 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 填充每个列表项的数据,而不必单独查找每个列表项?

是否可以使用 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 ;
    }
}