18

我正在使用 Dapper 从 SQL 进行查询,并有这样的动态查询:

var returns = conn.Query(dynamicQuery);

然后,当我循环浏览结果时,我想找出我正在处理的日期类型是什么,所以我尝试执行以下操作:

foreach (var result in results)
{
    MessageBox.Show(result.GetType().ToString());
}

但它总是失败并MessageBox出现错误Cannot perform runtime binding on a null reference

如果我改用这个:

var returns = conn.Query<object>(dynamicQuery);

然后该命令有效,但它给了我一个Dapper.SqlMapper+DapperRow对象类型。

如何找到dynamic变量的类型?

4

3 回答 3

20

使用动态 api,您应该知道列的形状,即

foreach(dynamic row in query) {
    int id = row.Id;
    //...
}

IDictionary<string, object>但是,如果事情不太清楚,每一行也会实现:所以强制转换。

或者,如果(评论)您知道有一个日期时间类型的单元格:

var when = conn.Query<DateTime>(...).Single();
于 2013-11-05T19:14:40.570 回答
-3
int RecCount = ((dynamic)res[0]).RecCount;
于 2015-01-06T06:20:16.093 回答
-3
Friend Function GetDepartment(ByVal DateFrom As String, ByVal DateTo As String)
    Dim xSQL As New System.Text.StringBuilder
    xSQL.AppendLine("SELECT SUM(a.Quantity ) AS quantity, ")
    xSQL.AppendLine("    SUM(a.TotalAmount ) AS totalamount, ")
    xSQL.AppendLine("    a.ProductID, ")
    xSQL.AppendLine("    c.DepartmentID, ")
    xSQL.AppendLine("    a.LongName, ")
    xSQL.AppendLine("    c.Department ")
    xSQL.AppendLine("FROM Transaction01Details a ")
    xSQL.AppendLine("    INNER JOIN Product00header b ON a.ProductID = b.ProductID ")
    xSQL.AppendLine("    INNER JOIN Department00header c ON b.DepartmentID = c.DepartmentID ")
    xSQL.AppendLine("WHERE (a.Tag4 = 'i') ")
    xSQL.AppendLine("    AND (a.TransDate BETWEEN @Date1 AND @Date2) ")
    xSQL.AppendLine("GROUP BY a.ProductID ")
    xSQL.AppendLine("ORDER BY a.LongName ")

    ' Lambda Expression
    Dim lambda = cn.Query(xSQL.ToString, New With {.Date1 = DateFrom, .Date2 = DateTo}).Select(Function(p) New With {.ProductID = CStr(p.ProductID), _
                                                                                    .DepartmentID = CStr(p.DepartmentID), _
                                                                                    .LongName = CStr(p.LongName), _
                                                                                    .Department = CStr(p.Department), _
                                                                                    .Quantity = CDec(p.Quantity), _
                                                                                    .TotalAmount = CDec(p.TotalAmount)}).ToList

    ' Linq Expression
    Dim linq = (From p In cn.Query(xSQL.ToString, New With {.Date1 = DateFrom, .Date2 = DateTo})
                Select New With {.ProductID = CStr(p.ProductID), ' Note, All p.Object is also dynamic
                                 .DepartmentID = CStr(p.DepartmentID), 
                                 .LongName = CStr(p.LongName),
                                 .Department = CStr(p.Department),
                                 .Quantity = CDec(p.Quantity),
                                 .TotalAmount = CDec(p.TotalAmount)}).ToList


    ' in linq, no need to declare function and also no need to put this  --- >  _ to continue the statement


End Function

你可以通过这个在visual basic中实现动态映射..我给了鱼..轮到你做饭了

于 2017-02-17T03:07:33.063 回答