2016-12-15 69 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所做的。