【问题标题】:How to read data from DapperRow?如何从 DapperRow 读取数据?
【发布时间】:2021-05-21 20:37:35
【问题描述】:

我正在为基于 .NETFramework = 4.7.2 的 asp.net web api2 应用程序使用 Dapper version="2.0.78"。

这是我的响应对象:

SampleResponse.cs

public class SampleResponse
{
    public SampleResponse()
    {
        Test1 = new List<A>();
        Test2 = new List<A>();
        Test3 = new List<A>();
    }

    public bool IsValueReady
    {
        get;
        set;
    }

    public List<A> Test1
    {
        get;
        set;
    }

    public List<A> Test2
    {
        get;
        set;
    }

    public List<A> Test3
    {
        get;
        set;
    }
}

public async Task<SampleResponse> GetDataAsync(RequestDTO value)
{
    SampleResponse response = null;
    using (var conn = await _dapperService.CreateConnection())
    {
        var data = await conn.QueryMultipleAsync("stp_FetchData", commandType: CommandType.StoredProcedure);
        var response1 = await data.ReadAsync();
        var response2 = await data.ReadAsync<A>();
        var response3 = await data.ReadAsync<A>();
        var response4 = await data.ReadAsync<A>();
        response = new SampleResponse{IsValueReady = response1.FirstOrDefault(), Test1 = response2.ToList(), Test2 = response3.ToList(), Test3 = response3.ToList()};
    }

    return response;
}

stp_FetchData:

SELECT @pI_BIsValueReady AS IsValueReady
SELECT * FROM #Table1;
SELECT * FROM #Table2;
SELECT * FROM #Table3;

在调试下面一行

var response1 = await data.ReadAsync();

给我以下响应,我想从中读取 IsValueReady 的值

{{DapperRow, IsValueReady = 'True'}}

我想在这种情况下提取 IsValueReady 的值。

任何人都可以通过提供解决此问题的指导来帮助我吗?

【问题讨论】:

  • 你试过response1.IsValueReady吗?或response1.FirstOrDefault?.IsValueReady ?? false。我很确定没有指定类型的 Dapper 查询会返回 IEnumerable&lt;dynamic&gt;
  • 感谢@Flydog57 的回复。是的,您是正确的,返回类型是 IEnumerable。你能帮我一些关于在这种情况下如何读取值的代码示例吗?对此的任何帮助都非常感谢
  • 好吧,在IEnumerable&lt;T&gt; 上调用FirstOrDefault 会给您一个T,或者,如果集合为空,则为默认值,在本例中为null。因此,到那时,您将拥有nulldynamic。既然你知道你感兴趣的属性名称,你就可以得到它:response1.FirstOrDefault()?.IsValueReady??false 应该这样做。 FirstOrDefault 调用将返回 null 或动态值。如果结果为非空,?. 将调用 IsValueReady。如果它为空,它将使整个表达式为空。 ?? 表示返回值,但如果为 null,则返回 false
  • 如果我有 {{DapperRow, IsValueReady = 'True',AnotherValue = "abc"}} 怎么样。
  • 了解dynamic 的工作原理

标签: c# asp.net-web-api2 dapper


【解决方案1】:

非常感谢@Flydog57。我对动态类型做了一些阅读,并能够使用以下代码 sn-p 解决问题:

public async Task<SampleResponse> GetDataAsync(RequestDTO value)
{
    SampleResponse response = null;
    using (var conn = await _dapperService.CreateConnection())
    {
        var data = await conn.QueryMultipleAsync("stp_FetchData", commandType: CommandType.StoredProcedure);
        var response1 = await data.ReadAsync();
        var response2 = await data.ReadAsync<A>();
        var response3 = await data.ReadAsync<A>();
        var response4 = await data.ReadAsync<A>();
        
        var tempData = response1.FirstOrDefault();
        
        
        
        response = new SampleResponse{IsValueReady = tempData.IsValueReady, Test1 = response2.ToList(), Test2 = response3.ToList(), Test3 = response3.ToList()};
    }

    return response;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 2011-01-26
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多