WHERE 절의 Dapper 및 DateTime은 다중 매핑 된 null을 발생시킵니다.

dapper datetime sql-server

문제

마침내 멀티 매핑 쿼리를 구성하고 의미있는 데이터를 반환 할 수있었습니다. 이 쿼리는 다른 개체로 구성된 사용자 지정 개체의 목록을 반환했습니다. 그러나이 쿼리는 단일 매개 변수로 작업했습니다.

두 번째 매개 변수 인 DateTime을 추가하여이 쿼리를 수정했을 때 집계 된 개체 (Part 및 Color) 중 두 개가 null이었습니다. 그러나 프로파일 러에서 SQL을 캡처하고 SQL Server에서 실행하면 모든 데이터가 거기에있었습니다!

where 절에서 DateTime 매개 변수를 더 잘 처리하려면 어떻게해야합니까? 그것은 분명히이 문제를 일으키는 것입니다.

다음 코드는 주석 처리 된 where 절과 함께 작동하지만 기존 항목은 작동하지 않습니다.

  public IList<PartReceipt> GetReceiptHistory(ListItem supplier, DateTime dateReceived)
  {
     const string sql =
        @"SELECT r.id,  r.Quantity, r.UnitCost, r.DateReceived,
                 s.Id , s.Description, 
                 p.Id, p.Number, p.Description, p.StockClass,
                 mp.Id , mp.Number, mp.ManufacturerId, mp.Description,
                 m.Id , m.Description, m.ShortDescription, 
                 c.Id, c.Description, 
                 pc.Id, pc.Name, pc.Description
          FROM   PartReceipt r
          INNER JOIN Supplier s ON r.SupplierId = s.Id
          INNER JOIN Part p on r.PartId = p.Id
          INNER JOIN ManufacturerPart mp ON p.ManufacturerPartId=mp.Id
          INNER JOIN Manufacturer m ON mp.ManufacturerId = m.Id
          LEFT JOIN Color c ON p.ColorId=c.Id
          LEFT JOIN ProductCategory pc ON p.ProductCategoryId=pc.Id
          WHERE s.Id=@supplierId AND r.DateReceived = @dateReceived";

     //           WHERE s.Id=@supplierId";
     IList<PartReceipt> reportData;
     using (DbConnection connection = ConnectionFactory.GetOpenConnection())
     {
        reportData = connection.Query<PartReceipt>(sql,
           new
           {
              supplierId = supplier.Id,
              dateReceived
           }).ToList();
     }
     return reportData;
  }  

그리고 지원 수업은 다음과 같습니다 :

  public class PartReceipt
  {
     public int Id { get; set; }
     public Supplier Supplier { get; set; }
     public Part Part { get; set; }
     public DateTime DateReceived { get; set; }
     public Decimal UnitCost { get; set; }
     public int Quantity { get; set; }
  }   

  public class Part
  {
     public Color Color { get; set; }
     public string Description { get; set; }
     public int Id { get; set; }
     public ManufacturerPart ManufacturerPart { get; set; }
     public string Number { get; set; }
     public string PicturePath { get; set; }
     public ProductCategory ProductCategory { get; set; }
     public string StockClass { get; set; }
  }

  public class ManufacturerPart
  {
     public string Description { get; set; }
     public int Id { get; set; }
     public int ManufacturerId { get; set; }
     public string Number { get; set; }
     public Manufacturer Parent { get; set; }
  }   

  public class Manufacturer
  {
     public string Description { get; set; }
     public int Id { get; set; }
     public string ShortDescription { get; set; }
  }   

  public class ProductCategory
  {
     public string Description { get; set; }
     public int Id { get; set; }
     public string Name { get; set; }
  }   

  public class Color
  {
     public string Description { get; set; }
     public int Id { get; set; }
  }  

수락 된 답변

나는이 질문을 게시하기 전에 더 조심하지 않아서 미안합니다. 필자는 다중 매핑 쿼리를 올바르게 구성하지 않았습니다. 내가 할 때, 그 작품.

  public IList<PartReceipt> GetReceiptPart(ListItem supplier, DateTime dateReceived)
  {
     const string sql =
        @"SELECT r.id,  r.Quantity, r.UnitCost, r.DateReceived,
                 s.Id , s.Description, 
                 p.Id, p.Number, p.Description, p.StockClass,
                 mp.Id , mp.Number, mp.ManufacturerId, mp.Description,
                 m.Id , m.Description, m.ShortDescription, 
                 c.Id, c.Description, 
                 pc.Id, pc.Name, pc.Description
          FROM   PartReceipt r
          INNER JOIN Supplier s ON r.SupplierId = s.Id
          INNER JOIN Part p on r.PartId = p.Id
          INNER JOIN ManufacturerPart mp ON p.ManufacturerPartId=mp.Id
          INNER JOIN Manufacturer m ON mp.ManufacturerId = m.Id
          LEFT JOIN Color c ON p.ColorId=c.Id
          LEFT JOIN ProductCategory pc ON p.ProductCategoryId=pc.Id
          WHERE s.Id=@supplierId AND r.DateReceived = @dateReceived";

     IList<PartReceipt> reportData;
     using (DbConnection connection = ConnectionFactory.GetOpenConnection())
     {
        reportData =
         connection
            .Query
            <PartReceipt, Supplier, Part, ManufacturerPart, Manufacturer, Color, ProductCategory, PartReceipt>(
               sql,
               (receipt, supp, part, mfgPart, mfg, color, productCategory) =>
               {
                  receipt.Supplier = supp;
                  receipt.Part = part;
                  receipt.Part.ManufacturerPart = mfgPart;
                  receipt.Part.ManufacturerPart.Parent = mfg;
                  receipt.Part.Color = color;
                  receipt.Part.ProductCategory = productCategory;
                  return receipt;
               }, new { supplierId = supplier.Id, dateReceived })
            .ToList();
     }
     return reportData;
  }


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.