Linq查询类型List的Dictionary

时间:2013-09-16 17:56:21

标签: vb.net linq dictionary

我有一本类型的字典 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#也会这样做。

提前致谢............

1 个答案:

答案 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)。但是,此查询可能会失败,因为内部列表可能不包含单个值。