2013-10-30 17 views
0

說例如我有一個List<Person>其中每個人有十幾個屬性。列表生成時,前十個屬性全部設置。我可以使用Linq從列表<object>設置屬性從數據讀取器

後來我需要填充列表中每個項目上最後兩個屬性的數據。

我有一個存儲過程,返回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來填充數據爲每個列表項目,而不必單獨找到每個列表項目?

+3

這已經是最可讀和最有效的方式了。你爲什麼要用'SqlDataReader'來使用LINQ?爲什麼你把這個清單通過這個方法呢?通常你會從數據創建一個,然後從方法中返回。 –

+0

[這裏](http://stackoverflow.com/a/12500843/284240)是一個例子,你可以如何在LINQ中使用'SqlDataReader',只需將其轉換爲'IDataRecord'。但LINQ並不是正確的工具,無論如何都不會更新某些東西。 –

+0

我想我真正想知道的是,如果有更有效的方法來處理我在這裏要做的事情。我當然想不起一個。 – Travis

回答

0

你可以做這樣的事情......

雖然沒有「強迫」的LINQ這裏的多大用處...

也許聯接是升技比調用優先()每次快。 ..

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 ; 
    } 
} 
相關問題