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

Converting VB.net lambda expression anonymous type result to known type

我没有多少 VB.net 经验,而且我很难弄清楚自己做错了什么。我有一个 lambda 表达式,它 return 是一个匿名类型的结果集。我正在尝试将此集转换为已知类型,然后 return 将其返回到调用方法,但我无法将结果集转换为已知类型。或者,也许我会以错误的方式解决这个问题。错误是 "cannot convert anonymous type to QuickSearchViewModelDataObject type"。任何帮助将不胜感激。

Class:

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;不需要 Select。关于 Join 的第三个参数:

Function(mi, im) New QuickSearchViewModelDataObject() With {
    .Description = mi.Description, _
    ...
})
...

这就是最后获得正确对象类型所需的全部内容。 参见 fiddle:here

我会留下我之前的回答,以防对其他人有帮助:

如果你一直在处理IEnumerable(Of QuickSearchViewModelDataObject),你不需要用Select来投影它。但是,如果您正在处理匿名类型(例如,来自早期的 Join),并且您需要投影到您最终想要的类型,这很容易:

.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 查询在 Select 之前采用什么形式并不重要 - 您肯定会从中得到 QuickSearchViewModelDataObject。 (如果您想投影到 DTO 而不是您的实体对象,这也很有用)。

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

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