如何使用 Dapper 编写原始 SQL 并使用 C# 映射到实体类

问题描述 投票:0回答:1

我想编写原始 SQL 以从一组存在一对多关系的表中获取结果集。

我正在使用 Dapper 来实现此目的,但没有得到预期的结果。

第一张桌子是

Supplier
:

    public class Supplier: IId
    {
        public int Id { get; set; }
        public string Ref{ get; set; }
        public DateTime CreatedOn { get; set; }
        public List<Category> Categories{ get; set; }
        public int? Ticket { get; set; }
    }

然后是

Category

    public class Category: IId
    {
        public int Id { get; set; }
        public int SupplierId{ get; set; }
        [JsonIgnore] public Supplier Supplier{ get; set; }
        public Type Type { get; set; }
        public Status Status { get; private set; }
        public string CompletedBy { get; private set; }
        public string CreatedBy { get; private set; }
        public DateTime? CreatedOn { get; private set; }
        public int? Ticket { get; set; }
    }

这是我的 SQL:

var reference = 5055;

var sql = "SELECT S.Ref,S.CreatedOn,S.Ticket" +
          "       C.TaskId AS 'Id', C.SupplierId, C.Type, C.Status, C.CompletedBy, C.CreatedBy, C.CreatedOn, C.Ticket " + 
          "FROM Category C " +
          "INNER JOIN Supplier S ON S.SupplierId = C.SupplierId " +
          "WHERE S.Ref = @reference ";

 var parameters = new {reference};

 var suppliers = connection.QueryAsync<Supplier, List<Category>, Supplier>(sql, (supplier,category)   => {
                    supplier.Categories = category;
                    return supplier;
                }, parameters, splitOn: "Id" );

var result = suppliers.Result.OrderByDescending(x => x.CreatedOn).FirstOrDefault();

我想要的是类别应该包含在供应商实体中,我阅读了 Dapper 的文档,并从中尝试了此处显示的代码,但它不起作用。

有人可以帮我吗?

有人可以告诉我另一种方法吗,例如使用 SQL 视图或存储过程?

c# asp.net-core dapper rawsql
1个回答
0
投票

我如何找到解决这个问题的方法是

var reference = 5055;

var sql = "SELECT S.SupplierId As 'Id',S.Ref,S.CreatedOn,S.Ticket " +
          "FROM Supplier S " +
          "WHERE S.Ref = @reference ";

 var parameters = new {reference};

 var suppliers = connection.QueryFirstOrDefault<Supplier>(sql, parameters);

 suppliers.Category =  (List<Category>) connection.Query<Category>("SELECT C.CategoryId As 'Id',C.SupplierId,C.Type,C.Status,C.CompletedBy,C.CompletedOn,C.CreatedBy,C.CreatedOn,C.Ticket FROM Category C WHERE C.SupplierId= @supplierId", new { supplierId = suppliers.Id});
            return suppliers;
© www.soinside.com 2019 - 2024. All rights reserved.