在VB.Net中查询并使用Dapper中的动态/匿名对象

时间:2014-01-14 16:03:58

标签: .net vb.net dynamic dapper

我有一个查询,我在其中执行复杂的计算,包括NULL处理和除以0的特殊情况。这是一个简化的示例,仅作为问题的上下文提供:

SELECT
    CASE
        WHEN SUM(f.AmountA) > 0 AND SUM(f.AmountB) > 0 THEN --Perform calculations...
        WHEN SUM(f.AmountB) < 0 THEN --Perform calculations...
        WHEN SUM(f.AmountB) = 0 THEN --Perform calculations...
    END AS Result
FROM Foo f
JOIN Bar b ON b.BarID = f.BarID

为了提高可维护性和可读性,我想让计算由.Net代码执行。该查询与此示例类似:

SELECT SUM(f.AmountA) AS SumA, SUM(b.AmountB) AS SumB
FROM Foo f
JOIN Bar b ON b.BarID = f.BarID

然后,我需要查询那些未在特定POCO中定义的字段(使用Dapper)。在C#中,我可以做类似于this answer and its comments中所做的事情。但是,在带有Option Strict On的VB.Net中,我无法做到这一点。

为了更好地描述我正在尝试做的事情,这就是可能的样子,如果它不是Option Strict On disallows late bindingu.SumA的错误u.SumB {1}}语句中的{1}}。请注意,我将New With设置在班级的顶部:

Option Infer On

这可能与VB中缺少Using connection As New SqlClient.SqlConnection(myConnectionString) Dim result = connection.Query(myQuery).Select(Function(u) New With {.SumA = u.SumA, .SumB = u.SumB}).FirstOrDefault() If result.SumA > 0 AndAlso result.SumB > 0 Then 'Perform calculations... End If 'Other cases... End Using 类型有关。因此,非通用dynamic覆盖会返回Query而不是其C#对应的IEnumerable(Of Object)

我的问题是:有没有办法做我想用Dapper和VB.Net做的事情?

1 个答案:

答案 0 :(得分:0)

我刚写了一个简单的(私有/内部)数据类,它具有映射所需的所有属性。我知道这很难过,但那就是vb.net ......