Dapper如何将列映射到实体属性?

3

我正在使用Dapper的Query<>来搜索多条记录:

public class Product
{
    public int Id {get; set}
    public string Name {get; set}
    public int CategoryId {get; set}
]

public IEnumerable<Product> GetProducts(int categoryId)
{
    var connection = DataContext.Database.Connection;

    var sql = "SELECT * FROM products WHERE category_id = @categoryId";

    var result = connection.Query<Product>(sql, new { categoryId });

    return result;
}

查询本身会返回所请求的记录,但列表中的每个对象都有空字段。

那么我该如何将列映射到实体的属性?

我不想在SQL语句中添加列别名。修饰实体属性也不是一个选项,因为实体是由EF设计器生成的。


1
你可以使用DapperExtensions包,并通过继承ClassMapper<Product>或AutoMapper<Product>来创建自定义映射器。更多信息请参见此处。我没有时间给出完整的答案,但我相信你还需要从使用Query方法改为使用Get方法。 - Shane
1个回答

8

你的产品类必须被定义成与查询结果相匹配。因此,你可以这样做 -

public IEnumerable<Product> GetProducts(int categoryId)
{
    var connection = DataContext.Database.Connection;

    var sql = "SELECT * FROM products WHERE category_id = @categoryId";

    var result = connection.Query<Product>(sql, new { categoryId }).Select(p => new Product {
           Id = (int)p.ProductId,
           Name = (string)p.ProductName,
           CategoryId  = (int)p.ProductCategoryId
        });

    return result;
}

这是一个很好的答案,因为对于一次性查询和映射,这个解决方案就足够了。然而,对于需要进行多次查询和映射的情况,DapperExtensions 是更好的选择。 - Ivan-Mark Debono
对于许多查询或一些复杂对象,您需要使用DapperExtensions。无论如何,很高兴能帮助您,如果您可以为我的答案点赞,我将不胜感激.. :) - Krishnraj Rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接