Dapper et DateTime dans la clause WHERE entraînent des valeurs NULL multi-mappées

dapper datetime sql-server

Question

J'ai finalement pu construire une requête multi-mappée et retourner des données significatives. Cette requête a renvoyé une liste d'objets personnalisés qui sont eux-mêmes composés d'autres objets. Mais cette requête a fonctionné avec un seul paramètre.

Lorsque j'ai modifié cette requête en ajoutant un second paramètre, un DateTime, deux des objets agrégés (Part et Color) étaient nuls. Cependant, lorsque j'ai capturé le SQL dans le profileur et que je l'ai exécuté dans SQL Server, toutes les données étaient présentes!

Comment puis-je mieux gérer un paramètre DateTime dans la clause where? C'est évidemment ce qui cause le problème.

Le code qui suit fonctionne avec la clause where commentée mais pas celle existante.

  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;
  }  

Et les classes de soutien sont les suivantes:

  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; }
  }  

Réponse acceptée

Je suis désolé je n'étais pas plus prudent avant de poster cette question. Je n'ai pas construit la requête multi-mappée correctement. Quand je fais, ses œuvres.

  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;
  }



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi