将VB.net lambda表达式匿名类型结果转换为已知类型

将VB.net lambda表达式匿名类型结果转换为已知类型,vb.net,linq,lambda,anonymous-types,Vb.net,Linq,Lambda,Anonymous Types,我没有太多的VB.net经验,我很难找出我做错了什么。我有一个lambda表达式,它返回一个匿名类型的结果集。我试图将此集合转换为已知类型,并将其返回给调用方法,但无法将结果集转换为已知类型。或者,也许我走错了方向。错误为无法将匿名类型转换为QuickSearchViewModelDataObject类型。任何帮助都将不胜感激 类别: Public Class QuickSearchViewModelDataObject Public Property ItemNum As String

我没有太多的VB.net经验,我很难找出我做错了什么。我有一个lambda表达式,它返回一个匿名类型的结果集。我试图将此集合转换为已知类型,并将其返回给调用方法,但无法将结果集转换为已知类型。或者,也许我走错了方向。错误为无法将匿名类型转换为QuickSearchViewModelDataObject类型。任何帮助都将不胜感激

类别:

Public Class QuickSearchViewModelDataObject
    Public Property ItemNum As String
    Public Property Description As String
    Public Property OnHandQty As Integer?
    Public Property PriceClass As String
    Public Property Price As Decimal?
    Public Property TakeOrderF As Boolean
    Public Property Warranty As String
    Public Property ActiveF As Boolean
End Class
方法:

Public Function GetItemByItemNumber(itemNumber As String) As QuickSearchViewModelDataObject Implements Model.IInventoryRepository.GetItemByItemNumber

    Using context As New MBAModel
        Dim returnedItem = context.OneInventories.Join(context.TwoInventories,
                                         Function(mi) mi.ItemNum,
                                         Function(im) im.ItemNum,
                                         Function(mi, im) New With {mi, im}) _
                                   .Select(Function(o) New With
                                   {
                                        .Description = o.mi.Description, _
                                        .OnHandQty = o.im.OnHandQty, _
                                        .PriceClass = o.mi.Class, _
                                        .Warranty = o.mi.Warranty, _
                                        .Price = o.im.Price, _
                                        .TakeOrderF = o.mi.TakeOrderF, _
                                        .ItemNum = o.mi.ItemNum, _
                                        .ActiveF = o.mi.ActiveF
                                    }).Where(Function(x) x.ItemNum = itemNumber AndAlso x.ActiveF).FirstOrDefault()

            Return returnedItem
    End Using

End Function
编辑:OneFineDay是正确的-您可以从您的加入中获得QuickSearchViewModelDataObject;无需选择。关于Join的第三个参数:

Function(mi, im) New QuickSearchViewModelDataObject() With {
    .Description = mi.Description, _
    ...
})
...
这就是最终获得正确对象类型所需的全部内容。 参见小提琴:

我将保留我先前的答案,以防对其他人有所帮助:

如果您一直在处理QuickSearchViewModelDataObject的IEnumerableOf,则不需要使用Select对其进行投影。但是,如果您正在处理来自早期联接的匿名类型,例如,您需要投影到最终所需的类型,则很容易:

.Select(Function(o) New QuickSearchViewModelDataObject() With {
    .Description = o.mi.Description, _
    .OnHandQty = o.im.OnHandQty, _
    .PriceClass = o.mi.Class, _
    .Warranty = o.mi.Warranty, _
    .Price = o.im.Price, _
    .TakeOrderF = o.mi.TakeOrderF, _
    .ItemNum = o.mi.ItemNum, _
    .ActiveF = o.mi.ActiveF
})
在这种情况下,无论LINQ查询在选择之前采用什么形状,您肯定会从中获得QuickSearchViewModelDataObject。如果您希望投影到DTO而不是实体对象,这也很有用。

编辑:OneFineDay是正确的-您可以从加入中获得QuickSearchViewModelDataObject;无需选择。关于Join的第三个参数:

Function(mi, im) New QuickSearchViewModelDataObject() With {
    .Description = mi.Description, _
    ...
})
...
这就是最终获得正确对象类型所需的全部内容。 参见小提琴:

我将保留我先前的答案,以防对其他人有所帮助:

如果您一直在处理QuickSearchViewModelDataObject的IEnumerableOf,则不需要使用Select对其进行投影。但是,如果您正在处理来自早期联接的匿名类型,例如,您需要投影到最终所需的类型,则很容易:

.Select(Function(o) New QuickSearchViewModelDataObject() With {
    .Description = o.mi.Description, _
    .OnHandQty = o.im.OnHandQty, _
    .PriceClass = o.mi.Class, _
    .Warranty = o.mi.Warranty, _
    .Price = o.im.Price, _
    .TakeOrderF = o.mi.TakeOrderF, _
    .ItemNum = o.mi.ItemNum, _
    .ActiveF = o.mi.ActiveF
})

在这种情况下,无论LINQ查询在选择之前采用什么形状,您肯定会从中获得QuickSearchViewModelDataObject。如果您希望投影到DTO而不是实体对象,这也很有用。

您不需要Select子句,只需要Where子句,这将返回实体类型

      .Where(Function(x) x.ItemNum = itemNumber AndAlso x.ActiveF).FirstOrDefault()

您不需要Select子句,只需要Where子句,这将返回实体类型

      .Where(Function(x) x.ItemNum = itemNumber AndAlso x.ActiveF).FirstOrDefault()

连接的结果不是一个匿名类型吗?新的带有{mi,im}的匿名类型?这也应该被删除。这一点很好。我已经有一段时间没有做LINQ连接了,尤其是在VB.NET中。干杯。加入的结果不是一个匿名类型吗?新的带有{mi,im}?这也应该被删除。很好。我已经有一段时间没有做LINQ连接了,尤其是在VB.NET中。干杯