2015-10-14 137 views
0

我有以下2类LINQ查询返回的IEnumerable

Public Class LookupsModel 
Implements IEnumerable(Of LookupModel) 

Public _LookupModel() As LookupModel 

Public Sub New(pArray As ArrayList) 
    _LookupModel = New LookupModel(pArray.Count - 1) {} 

    Dim i As Integer 
    For Each l As LookupModel In pArray 
     _LookupModel(i) = l 
     i += 1 
    Next 
End Sub 

Public Function GetEnumerator() As IEnumerator(Of LookupModel) Implements IEnumerable(Of LookupModel).GetEnumerator 
    Return New LookupEmum(_LookupModel) 
End Function 

Public Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator 
    Return New LookupEmum(_LookupModel) 
End Function 

Public Property Heading1 As String 
Public Property Heading2 As String 
Public Property Heading3 As String 
Public Property Heading4 As String 
Public Property Heading5 As String 
Public Property Heading6 As String 
Public Property CalledBy As String 
Public Property ParmName1 As String 
Public Property ParmName2 As String 
Public Property ParmName3 As String 
Public Property ParmName4 As String 
Public Property ParmName5 As String 
Public Property ParmName6 As String 

Public Property ValueFieldGetter() As Func(Of LookupModel, String) 
Public Property DescriptionFieldGetter() As Func(Of LookupModel, String) 

End Class 

Public Class LookupModel 

Public Sub New(ByVal Key As String, Optional ByVal Desc As String = Nothing, Optional Extra_1 As String = Nothing, Optional Extra_2 As String = Nothing, Optional Extra_3 As String = Nothing, Optional Extra_4 As String = Nothing) 
    Me.Field1 = Key 
    Me.Field2 = Desc 
    Me.Field3 = Extra_1 
    Me.Field4 = Extra_2 
    Me.Field5 = Extra_3 
    Me.Field6 = Extra_4 
End Sub 
Public Sub New() 
    Me.Field1 = Nothing 
    Me.Field2 = Nothing 
    Me.Field3 = Nothing 
    Me.Field4 = Nothing 
    Me.Field5 = Nothing 
    Me.Field6 = Nothing 
End Sub 

Public Property Field1 As String 
Public Property Field2 As String 
Public Property Field3 As String 
Public Property Field4 As String 
Public Property Field5 As String 
Public Property Field6 As String 

End Class 

这是LINQ查询:

Dim lm As LookupsModel = GetLookupsModel(FieldID, lookup, LookupPage:=1, SearchField:=SearchField, SearchFields:=searchFields, SearchString:=String.Empty) 

Dim lm2 As IEnumerable(Of LookupModel) = lm.Where(Function(p)  p.Field1.Contains("A")) 

我想查询LookupsModel,只得到LookupModel集合,其中LookupModel.Field1以“A”开头。但是下面的查询返回一个Ienumerable的LookupModel,而不是LookupsModel对象,并且这些项目被排除。我们如何做到这一点并获得LookupsModel对象?

回答

0

您不能直接从IEnumerable(Of LookpupModel)转换为LookupsModel。您有几种选择:

  • 添加一个构造函数现有IEnumerable(Of LookupModel)
  • Where输出转换到ArrayList和使用您现有的构造函数。

但是LookupsModel首先是什么意思?你所做的只是包装一个LookupModel的数组,而不是添加任何附加功能。为什么不坚持使用IEnumerable(Of LookupModel)

+0

我想要一个LookupSmodel(复数),而不是一个LookupModel。 LookupsModel包含一个LookupModel数组。所以我想要一个LookupsModel,其中的数组中的所有LookupModel都符合条件 – jslumar

+0

@jslumar对不起,我错过了这个非常微妙的区别。 –

+0

@D Stanley这个源代码直接来自Microsoft Dynamics应用程序和他们的工程师,所以我不完全确定为什么封装,但这是我必须使用的。我同意你的观点,但我必须认为他们有一些理由。可能是因为查找类用于更多的事情,他们试​​图使其具有普遍性。我确实喜欢将IEnumerable 转换为ArrayList,然后将其传递给构造函数的想法。我会尽力回复你。 – jslumar