在dapper join查询中使用动态对象列表

时间:2016-02-07 13:54:02

标签: c# dapper

是否可以创建以下写入的dapper查询,其返回类型为IEnumerable<dynamic>,因为我没有Product&amp;供应商POCO。

IEnumerable<Product> products = sqlConnection
                    .Query<Product, Supplier, Product>(
                        @"select Products.*, Suppliers.* 
                          from Products join Suppliers 
                               on Products.SupplierId = Suppliers.Id
                               and suppliers.Id = 2",
                        (a, s) =>
                            {
                                a.Supplier = s;
                                return a;
                            }); 

如果我的sql查询如下所示,我的dapper查询将如何与IEnumerable<dynamic>的返回类型

select Products.ProductId,Products.ProductName,Products.ProductCategory, ProductPrice.Amount,ProductPrice.Currency
                              from Products join ProductPrice 
                                   on Products.ProductId = ProductPrice.ProductId

真诚感谢所有帮助。

由于

1 个答案:

答案 0 :(得分:0)

是的,您可以将查询结果映射到动态对象列表(文档here)。

    const string sql = @"select Products.ProductId, Products.ProductName, Products.ProductCategory, ProductPrice.Amount, ProductPrice.Currency
                        from Products join ProductPrice 
                        on Products.ProductId = ProductPrice.ProductId";

    IEnumerable<dynamic> products = sqlConnection.Query(sql);

在您的第一个示例中,您正在执行multi mapping,它将每个表行映射到2个对象而不是一个(ProductSupplier),然后在返回产品之前通过引用进行链接。我不认为你可以用动态对象做到这一点,因为Dapper无法知道如何在它们之间划分列。您可以通过测试确认这一点,将通用参数<Product, Supplier, Product>替换为<dynamic, dynamic, dynamic>

跳过多映射只意味着返回的dynamic对象将同时包含ProductSupplier属性,这对您来说可能不是问题。