【问题标题】:How to declare select entity data type in Entity Framework?如何在实体框架中声明选择实体数据类型?
【发布时间】:2023-03-25 00:05:02
【问题描述】:
    Dim itemList    

    itemList = From items In Context.Product
               Select New With {Key .Code = items.ITEM_CODE_, Key .Name = items.ITEM_NAME, Key .Eancode = items.EANCODE}    

    Dim sortList = itemList.Where(Function(u) u.Name.Contains("soap"))

当我执行最后一行时,我得到一个错误:

"方法调用失败,因为 'Public Function Where(predicate As String, ParamArray 参数 As System.Data.Objects.ObjectParameter()) 作为 System.Data.Objects.ObjectQuery`1[[VB$AnonymousType_2(Of VB$AnonymousType_2(Of Integer,String,String))' 不能用 这些参数:" & vbCrLf & " 参数匹配参数 “谓词”无法从“VB$AnonymousDelegate_0(Of 对象,对象)'到'字符串'。”

实际上,我想将itemList 实体传递给另一个方法,并且在该方法中我想动态使用过滤器/排序选项。

如下图

    Dim itemList

    itemList = From items In Context.Product
               Select New With {Key .Code = items.ITEM_CODE_, Key .Name = items.ITEM_NAME, Key .Eancode = items.EANCODE}        
    Call LoadData(itemList)

Sub LoadData(itemList as Object)
    Dim sortList = itemList.Where(Function(u) u.Name.Contains("soap"))
End Sub

请分享您的建议如何解决?

【问题讨论】:

    标签: vb.net entity-framework orm entity-framework-4 linq-to-entities


    【解决方案1】:

    只需创建一个具有CodeNameEancode 属性的新类。

    Public Class ProductRow
        Public Property Name As String
        Public Property Code As String   
        Public Property Eancode As String     
    End Class
    

    并且不要使用匿名类型,而是使用这种类型:

    Dim itemList
    itemList = From items In Context.Product
               Select New ProductRow With {Key .Code = items.ITEM_CODE_, Key .Name = items.ITEM_NAME, Key .Eancode = items.EANCODE}        
    Call LoadData(itemList)
    

    然后你可以将它传递给另一个函数:

    Sub LoadData(itemList as IQueryable(Of ProductRow))
        Dim sortList = itemList.Where(Function(u) u.Name.Contains("soap"))
    End Sub
    

    编辑: 如果您只在运行时知道列名,那么您需要dynamic LINQ library 之类的东西。在这种情况下,您可以使用IQueryable(Of Product)

    Sub LoadData(itemList as IQueryable(Of Product))
        Dim sortList = itemList.Where("ColumnXY LIKE '%soap%'");
    End Sub
    

    【讨论】:

    • 非常感谢@Marc。但我想按如下动态列过滤 [Dim sortList = itemList.Where(Function(u) u.Name.Contains("soap")) Dim sortList = itemList.Where(Function(u) u.Code.Contains( 10))] 这可以通过动态过滤器实现吗?
    • “动态过滤器”是什么意思。你有一个例子吗?因为 u.Name.Contains("soap") 或 u.Code.Contains(10) 已经可以了..
    • 假设我将按名称过滤,例如 Dim sortList = itemList.Where(Function(u) u.Name.Contains("soap"))。后来用户想按代码过滤数据,那么我如何替换上面表达式中的代码而不是名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多