2013-03-15 53 views
0

我有一个要求,修改一个函数,使用LINQ查询通过为每个项目添加额外的布尔值来返回一个数据集合,所以为了简单起见,我决定将返回类型更改为一个KeyValuePairs的列表。但是,我有一个我无法解决的错误,或者不幸的理解。LINQ查询与VB.NET的问题

原来的版本或功能如下:

Private Function GetSelectedExtractors() As List(Of ExtractionMapping) 

    Return _extractionSelections _ 
     .SelectMany(Function(x) x.ExtractionRoutineSelection) _ 
     .Where(Function(x) x.Selected) _ 
     .Select(Function(x) x.ExtractionMapping) 

End Function 

新版本,与错误,低于:

Private Function GetSelectedExtractors() As List(Of KeyValuePair(Of ExtractionMapping, Boolean)) 

    Return _extractionSelections _ 
     .SelectMany(Function(x) x.ExtractionRoutineSelection) _ 
     .Where(Function(x) x.Selected) _ 
     .Select(Function(x) New KeyValuePair(Of ExtractionMapping, Boolean) _ 
        (x.ExtractionMapping, x.DeleteExistingInstances)) 

End Function 

我收到的错误是这样的:

Overload resolution failed because no accessible 'Select' can be called with these  arguments: 
Extension method 'Public Function Select(Of TResult)(selector As System.Func(Of ExtractionRoutineSelection, Integer, TResult)) As System.Collections.Generic.IEnumerable(Of TResult)' defined in 'System.Linq.Enumerable': Nested function does not have a signature that is compatible with delegate 'System.Func(Of ExtractionRoutineSelection, Integer, TResult)'. 
Extension method 'Public Function Select(Of TResult)(selector As System.Func(Of ExtractionRoutineSelection, Integer, TResult)) As System.Collections.Generic.IEnumerable(Of TResult)' defined in 'System.Linq.Enumerable': Data type(s) of the type parameter(s) cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error. 
Extension method 'Public Function Select(Of TResult)(selector As System.Func(Of ExtractionRoutineSelection, TResult)) As System.Collections.Generic.IEnumerable(Of TResult)' defined in 'System.Linq.Enumerable': 'DeleteExistingInstances' is not a member of 'Domain.ProductionWizard.ExtractionRoutineSelection'. 
Extension method 'Public Function Select(Of TResult)(selector As System.Func(Of ExtractionRoutineSelection, TResult)) As System.Collections.Generic.IEnumerable(Of TResult)' defined in 'System.Linq.Enumerable': Data type(s) of the type parameter(s) cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error. 

我已经在C#中完成了大量的LINQ查询,但在VB中没有那么多,所以很可能是我对th的理解e语法。我已经尝试了几个变体,但没有成功,我可以将其转换为匿名类型,而不是KeyValuePair,但这不适用于此实现。

任何解决方案或技巧将不胜感激。

回答

0

貌似x.DeleteExistingInstances无效:

'DeleteExistingInstances' is not a member of Domain.ProductionWizard.ExtractionRoutineSelection' 

修正了,它应该工作,只要你想。

不过,我会建议使用Tuple,而不是KeyValuePair

Private Function GetSelectedExtractors() As List(Of Tuple(Of ExtractionMapping, Boolean)) 

    Return _extractionSelections _ 
     .SelectMany(Function(x) x.ExtractionRoutineSelection) _ 
     .Where(Function(x) x.Selected) _ 
     .Select(Function(x) Tuple.Create(x.ExtractionMapping, x.DeleteExistingInstances)) 
     .ToList() 

End Function 
+0

的'写的问题时x.DeleteExistingInstances'是一个错字!然而,在解决这个问题时,我注意到我实际上在错误的类中添加了有问题的属性!我觉得自己像个傻瓜!另一方面,为什么你会在这种情况下选择一个Tuple?我使用元组,但通常在输出中有两个以上的对象时。只是对你的意见感兴趣。 – XN16 2013-03-15 20:26:18

+1

因为它看起来不像您的数据之间存在真正的* key-value *关系。只有两个值,其中第一个和第二个都不是关键。当然 - 你有更大的图片,所以也许它真的是*键值*。我不认为只有这种方法。 – MarcinJuraszek 2013-03-15 20:30:17

+0

感谢您的解释,我想我已经使用'KeyValuePair'这么长时间了,我一直忘记'Tuple's可以用于这样的许多情况! – XN16 2013-03-15 20:32:33