2016-12-15 106 views
-2

我有一個以下列4列開始的結果集。他們從存儲過程調用返回。基於不同的值從列表創建列表

enter image description here

那是什麼結果已經是兩個不同的ID。

我需要做的是通過每個列表foreach並獲得結果集的不同ID(我現在不能使用LINQ,因爲它實際上是一個動態類型),並將行添加到新的List<>

所以,在這個例子的情況下,我會最終得到兩個List<> s。一個是Id 119948,有4行,一個是Id 14765,有3行。

要完成此操作,首先要通過列表獲取不同的ID,然後對不同的列表進行foreach,然後再次遍歷列表並將它們添加到列表<>?

+0

是的。這是使用內置獨立方法的最簡單的方法,否則你必須構建自己的邏輯來遍歷整個列表,通過檢查元素是否已經存在於每個元素中,將每個元素添加到單獨的列表(這將是不同的列表)列表和每個ID的2個單獨列表。相反,我會建議你在這種情況下使用字典。 –

+0

是的,我認爲可能是這樣。所以我首先瀏覽整個列表,並獲得所有不同的ID。 (所以我有一個帶有兩個ID的List ,然後遍歷該列表,然後遍歷主列表,其中id =當前的id。似乎有點粗略,但它起作用 – Craig

+0

雖然這是直接的方法 –

回答

1

關於

我不能使用LINQ現在,因爲它實際上是一個動態類型

Linq still works with dynamic types

關於

如果在列表中第一個的foreach的唯一途徑,得到了不同的 IDS,然後在列表中再次的foreach不同,的foreach並添加 他們到一個列表<>?

沒有,假設我理解你與動態類型所遇到的問題,你可以使用LINQ執行下列操作之一:

如果需要輸出是一個列表的列表,以及在這個問題存儲過程是在SqlDataReader執行結果的方式,你可以做到以下幾點與Linq(代替我的示例值你自己的價值觀,包括類型從dataRecord鑄造):

IEnumerable<IEnumerable<YourType>> yourListOfLists; 

using (var connection = new SqlConnection(someConnectionString)) 
using (var command = new SqlCommand(someStoreProcedureName, connection)) 
{ 
    connection.Open(); 
    command.CommandType = CommandType.StoredProcedure; 

    using (var reader = command.ExecuteReader()) 
    { 
     yourListOfLists = reader.Cast<IDataRecord>() 
           .ToList() 
           .Select(dataRecord => 
           new YourType() 
           { 
            VersionNumber = dataRecord.GetInt32(dataRecord.GetOrdinal("VersionNumber")), 
            Id = dataRecord.GetInt32(dataRecord.GetOrdinal("Id")), 
            FromType = dataRecord.GetString(dataRecord.GetOrdinal("FromType")), 
            FromStatusId = dataRecord.GetString(dataRecord.GetOrdinal("FromStatusId")) 
           }) 
           .GroupBy(youObject => youObject.Id) 
           .Select(group => group.ToList()) 
           .ToList(); 
    } 
} 

如果你真的想要的東西是基於了一些標識的兩種不同的列表:

IEnumerable<YourType> listOfId1; 
IEnumerable<YourType> listOfId2; 

using (var connection = new SqlConnection(someConnectionString)) 
using (var command = new SqlCommand(someStoreProcedureName, connection)) 
{ 
    connection.Open(); 
    command.CommandType = CommandType.StoredProcedure; 

    using (var reader = command.ExecuteReader()) 
    { 
     var combinedList = reader.Cast<IDataRecord>() 
           .ToList() 
           .Select(dataRecord => 
           new YourType() 
           { 
            VersionNumber = dataRecord.GetInt32(dataRecord.GetOrdinal("VersionNumber")), 
            Id = dataRecord.GetInt32(dataRecord.GetOrdinal("Id")), 
            FromType = dataRecord.GetString(dataRecord.GetOrdinal("FromType")), 
            FromStatusId = dataRecord.GetString(dataRecord.GetOrdinal("FromStatusId")) 
           }); 

     listOfId1 = combinedList.Where(item => item.Id == 111111).ToList(); 
     listOfId2 = combinedList.Where(item => item.Id == 222222).ToList(); 
    } 
} 

請注意,最有可能有更好的方法比在本例所示執行存儲過程。

1

如果在列表中第一個的foreach的唯一途徑,得到了不同的ID,然後在列表中再次的foreach不同,的foreach,並將它們添加到列表<>?

想象一下,按照顏色將蠟筆分類爲紙箱(並且箱子可以自由製作)。你會先通過所有的蠟筆,列出你有什麼顏色,然後回去分開它們嗎?不,你會按照需要將它們分開,並根據需要添加更多的垃圾箱。

所以不,你不必兩次通過收集。您只需找到每個項目的「關鍵」值,看看是否已經創建了「存儲桶」。如果是這樣,請將其添加到該存儲分區。如果沒有,請將新存儲桶添加到輸出集合並將該項目添加到該存儲桶。這基本上就是GroupBy所做的。