我有一本类型的字典
Dim dictionaryOfAlertsForSC As New Dictionary(Of String, List(Of AlertsBO))
。现在字典将始终有两个记录。我需要根据密钥过滤掉记录。我在字典上使用Linq
lstAlertsForSC = From kv As KeyValuePair(Of String, List(Of AlertsBO)) In dictionaryOfAlertsForSC Where kv.Key.Contains(ASSESSMENTS) Select kv.Value
其中lstAlertForSC是AlertBo类型的列表。它为Linq查询中的选择部分抛出了一些类型转换的运行时错误。异常的详细信息:Unable to cast object of type 'WhereSelectEnumerableIterator
2 [System.Collections.Generic.KeyValuePair 2[System.String,System.Collections.Generic.List
1 [MA.DMR.HCSIS.Common.AlertsBO]],MA.DMR.HCSIS.Common.AlertsBO]'要输入“System.Collections.Generic.List 1[MA.DMR.HCSIS.Common.AlertsBO]'.
这是我的详细代码:
Public Sub GenerateSCAlert(ByVal userInfo As UserInfoType)
Dim ispAlertProcessDAO As ISPAlertProcessDAO
Dim lstAlertsForSC As New List(Of AlertsBO)
Dim dictionaryOfAlertsForSC As New Dictionary(Of String, List(Of AlertsBO))
Dim strAlertBOXML As String
strAlertBOXML = String.Empty
Try
LoggingHelper.Log("----------------------ISP Action based Alert Management process for SC started----------------------", TraceEventType.Information, MethodBase.GetCurrentMethod(), LoggingHelper.ISPProcesses.ISPAlertForSC)
ispAlertProcessDAO = New ISPAlertProcessDAO(userInfo)
dictionaryOfAlertsForSC = ispAlertProcessDAO.GenerateSCAlert()
If (dictionaryOfAlertsForSC.Count > 0) Then
lstAlertsForSC = From kv As KeyValuePair(Of String, List(Of AlertsBO)) In dictionaryOfAlertsForSC Where kv.Key.Contains(ASSESSMENTS) Select kv.Value.Single()
If (lstAlertsForSC.Count > 0) Then
strAlertBOXML = ispAlertProcessDAO.GenerateXMLForActionBasedAlerts(True, lstAlertsForSC)
我在申请Linq时遇到异常
如果有人帮我解决这个问题会很有帮助。
我在vb.net中有我的应用程序,所以如果我在vb.net中得到答案将会有所帮助。但是c#也会这样做。
提前致谢............
答案 0 :(得分:0)
如果要获取特定键的元素,可以使用相应的访问器:
lstAlertsForSC = dictionaryOfAlertsForSC(ASSESSMENTS)
您的LINQ查询
From kv As KeyValuePair(Of String, List(Of AlertsBO))
In dictionaryOfAlertsForSC
Where kv.Key.Contains(ASSESSMENTS)
Select kv.Value
返回一个枚举器,它可以迭代查询的所有结果。当然,编译器不知道查询只能返回一个元素。这就是为什么结果是某种IEnumerable(Of List(Of String))
。
有IEnumerable(Of T)
的扩展方法可以获取单个元素。在查询结果上调用此方法可以获得所需的列表:
lstAlertsForSC =
(From kv As KeyValuePair(Of String, List(Of AlertsBO))
In dictionaryOfAlertsForSC
Where kv.Key.Contains(ASSESSMENTS)
Select kv.Value).Single()
如果您将括号留下如下:
lstAlertsForSC =
From kv As KeyValuePair(Of String, List(Of AlertsBO))
In dictionaryOfAlertsForSC
Where kv.Key.Contains(ASSESSMENTS)
Select kv.Value.Single()
然后在每个Single()
上调用kv.Value
方法,你得到ab IEnumerable(Of String)
。但是,此查询可能会失败,因为内部列表可能不包含单个值。