我有一个以下面4列开头的结果集。他们从存储过程调用回来。
结果有两个不同的ID。
我需要做的是foreach
通过每个列表并获取结果集的不同ID(我现在不能使用LINQ,因为它实际上是动态类型),并将行添加到新List<>
。
因此,在这个例子的情况下,我最终会得到两个List<>
。一个,对于Id 119948,有4行,一个用于Id 14765,有3行。
实现此目的的唯一方法是首先通过列表进行操作并获取不同的ID,然后预览不同的列表,然后再次遍历列表并将它们添加到List&lt;&gt;?
答案 0 :(得分:1)
<强>关于强>
我现在无法使用LINQ,因为它实际上是动态类型
Linq still works with dynamic types
<强>关于强>
如果只是首先通过列表前进并获得明确的方法 id,然后foreach distinct,再次通过列表并添加 他们到列表&lt;&gt;?
否,假设我理解您使用动态类型时遇到的问题,可以使用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();
}
}
如果您真正想要的是基于某些Id的两个不同的列表:
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 :(得分:1)
如果首先通过列表获取并获得不同的ID,然后预先显示不同的唯一方法,再次通过列表并将它们添加到List&lt;&gt;?
想象一下,用颜色将蜡笔分成垃圾箱(垃圾箱可自由制作)。您是否首先浏览所有蜡笔,列出您拥有的颜色,然后再将它们分开?不,你随时将它们分开,根据需要添加更多的垃圾箱。
所以不,你不必在集合上进行两次传递。你只需找到&#34;键&#34;每个项目的价值,看看&#34;桶&#34;已经创建了。如果是,请将其添加到该存储桶。如果没有,请将新存储桶添加到输出集合,并将该项目添加到该存储桶。这基本上是GroupBy
所做的。