【问题标题】:Is this late binding or what?这是后期绑定还是什么?
【发布时间】:2012-04-17 18:37:44
【问题描述】:

我将加密的电子邮件地址存储在我的数据库中,并使用我的 DoDecrypt 函数在 AspGrid 中显示未加密的电子邮件地址

所以我的 LINQ 查询类似于

Dim Query = From c In DB.Something Select New With {.Email = DoDecrypt(c.Email)}

在调试模式下返回一组电子邮件...

使用 Linq to datatable 函数后,返回的结果是在数据库中找到的,即加密的。

这里出了什么问题? 我应该如何修改我的 Linq 查询?

这是 Linq to datatable 函数

 Public Shared Function ToDataTable(DB As System.Data.Linq.DataContext, query As Object) As DataTable
        If query Is Nothing Then
            Throw New ArgumentNullException("query")
        End If

        Dim cmd As IDbCommand = DB.GetCommand(TryCast(query, IQueryable))
        Dim adapter As New SqlDataAdapter()
        adapter.SelectCommand = DirectCast(cmd, SqlCommand)
        Dim dt As New DataTable("sd")

        Try
            cmd.Connection.Open()
            adapter.FillSchema(dt, SchemaType.Source)
            adapter.Fill(dt)
        Finally
            cmd.Connection.Close()
        End Try
        Return dt
    End Function

【问题讨论】:

    标签: vb.net linq linq-to-sql datatable late-binding


    【解决方案1】:

    您需要实际解决查询,默认情况下它是后期绑定的,但如果您确实想要解决查询,您只需调用.ToList()。我刚刚将您的查询放在下面的括号中,并在最后调用.ToList()。不确定这是否是 exact VB 语法(此处来自 C# 知识),但主体仍然相同。

    Dim Query = (From c In DB.Something Select New With {.Email = DoDecrypt(c.Email)})
    .ToList()
    

    【讨论】:

    • 这实际上在Dim cmd As IDbCommand = DB.GetCommand(TryCast(query, IQueryable))行的ToDataTable函数(值不能为null。参数名称:查询)中引发异常
    • 查询现在将是一个 IEnumerable,因为它已被解析,而不是一个 IQueryable。如果你改变它,它会起作用吗?
    • 无法将类型为“System.Collections.Generic.List`1”的对象转换为类型“System.Linq.IQueryable”。
    • 将您的 TryCast 更改为 TryCast(query, IEnumerable)
    • 我已经这样做了,但显示的错误是上面的错误。我应该重新启动我的电脑吗?这件事吓坏了我(To 'System.Linq.IQueryable'???这到底是怎么回事?)
    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多