【问题标题】:c# dapper error when parameter is list<int> No mapping exists from object type <>f__AnonymousType20`1[[System.Int32[]c# dapper error when parameter is list<int> No mapping exists from object type <>f__AnonymousType20`1[[System.Int32[]
【发布时间】:2016-09-16 03:38:36
【问题描述】:
string sqlQuery = "SELECT SellingPrice, MarkupPercent, MarkupAmount FROM ProfitMargins WHERE QuoteId in @QuoteId";
var profitMargin = await ctx.Database.SqlQuery<dynamic>(sqlQuery, 
    new { QuoteId = new[] { 1, 2, 3, 4, 5 } }
//String.Join(", ", QuoteIds.ToArray()))).ToListAsync();

谁能看出我做错了什么?

对象类型不存在映射 f__AnonymousType20`1[[System.Int32[], mscorlib, 版本=4.0.0.0, Culture=neutral, PublicKeyToken=]] 到已知的托管提供者本地 输入。

我从这篇文章中得到了这个想法:SELECT * FROM X WHERE id IN (…) with Dapper ORM 回答者:@LukeH

更新:

我需要将它返回到一个列表中。查看我的整个功能,我已经根据@JFM发布的答案更改了代码,但现在无法添加.ToListAsync

@JFM

public static async Task<List<dynamic>> GetProfitMargin(List<int> QuoteIds)
{
    using (var conn = new SqlConnection(new MYContext().Database.Connection.ConnectionString))
    {   
       string sqlQuery = "SELECT SellingPrice, MarkupPercent, MarkupAmount FROM ProfitMargins WHERE QuoteId in @QuoteId";
        {
            var profitMargin =  conn.Query<dynamic>(sqlQuery
               , new { QuoteId = new[] { 1, 2, 3, 4, 5 } }).ToListAsync());                    
        }

【问题讨论】:

  • 您缺少awaittoListAsync。它是否适用于常规.ToList()

标签: c# sql dapper


【解决方案1】:
public static async Task<IEnumerable<dynamic>> GetProfitMargin(List<int> QuoteIds)
    {

        using (var conn = new SqlConnection(new MYContext().Database.Connection.ConnectionString))
        {   
           string sqlQuery = "SELECT SellingPrice, MarkupPercent, MarkupAmount FROM ProfitMargins WHERE QuoteId in @QuoteId";
            {
                IEnumerable<dynamic> profitMargin =  await conn.QueryAsync<dynamic>(sqlQuery
                   , new { QuoteId = new[] { 1, 2, 3, 4, 5 } });                    
            }

如果您不将其映射到列表或数组,则默认情况下它将是一个 IEnuerable。

【讨论】:

  • @MB 我要返回什么?
  • 用于恢复数据,但后来我将它放在哈希表中(带有键值),而不是列表。
【解决方案2】:

使用 Dapper 查询和映射动态对我来说效果很好:

string sqlQuery = "SELECT SellingPrice, MarkupPercent, MarkupAmount FROM ProfitMargins WHERE QuoteId in @QuoteId";

using(var conn = new SqlConnection(myConnString)
{
    var profitMargin = conn.Query<dynamic>(sqlQuery
       , new { QuoteId = new[] { 1, 2, 3, 4, 5 } });

}

【讨论】:

  • 谢谢,但我仍然无法正常工作。我需要它执行并作为列表返回。请参阅上面的更新。
  • 你为什么不把返回类型Task>改为Task>?
  • 然后我收到此错误:System.Collections.Generic.IEnumerable`1 需要无参数默认构造函数或一个匹配签名(System.Int32 SellingPrice、System.Int32 MarkupPercent、System.Int32 MarkupAmount) [[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=]] 物化
【解决方案3】:

不是 100% 确定问题是什么,但以下是如何使用 Dynamics 的示例:

    [Test]
    public void TestDynamicsTest()
    {
        var query = @"select 1 as 'Foo', 2 as 'Bar' union all select 3 as 'Foo', 4 as 'Bar'";

        var result = _connection.Query<dynamic>(query);

        Assert.That(result.Count(), Is.EqualTo(2));
        Assert.True(result.Select(x => x.Foo == 1).First());
        Assert.True(result.Select(x => x.Bar == 4).Last());
    }

更新

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var query = @"select 1 as 'Id', 'Foo' as 'Name' union all select 1 as 'Id', 'Bar' as 'Name'";
var result = _connection.Query<Person>(query);

foreach (var person in result)
{
    var output = string.Format("Id: {0}, Name: {1}", person.Id, person.Name);
}

如需更多示例,请查看 Dapper docs

【讨论】:

  • 谢谢。我不需要处理 c# 中的动态。我只需要从 js 中引用字段名称,所以我认为我不必在此处进行所有映射。我的问题是动态返回一个带有键值集的哈希表,即使我将它转换为 json,通常当我有一个自定义列表时,它会很好地转换并且我的角度可以轻松引用
  • 然后只映射到一个对象 .Query
  • 你能给我语法吗>?
  • 我看到你的更新,我知道效果很好,但我试图避免创建自定义类。我想用 list 做到这一点
猜你喜欢
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2022-07-31
  • 2018-09-15
  • 2019-07-24
  • 2019-04-12
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多