我在我的web API和dapper中使用ado .net并且我有一个功能,它检查订单和订单行,如果他们只有一个订单,但如果没有订单行的订单,它将不会显示订单详细信息。
public IHttpActionResult Get()
{
string retJson;
string constring = ConfigurationManager.AppSettings["DeliveryGocs"].ToString();
string sql = "SELECT * FROM Deliverys AS A INNER JOIN DeliveryLines AS B ON A.id = B.DeliveryId;";
using (var connection = new SqlConnection(constring))
{
var orderDictionary = new Dictionary<int, DeliverysItems>();
var list = connection.Query<DeliverysItems, DeliverItemLines, DeliverysItems>(
sql,
(order, orderDetail) =>
{
DeliverysItems orderEntry;
if (!orderDictionary.TryGetValue(order.id, out derEntry))
{
orderEntry = order;
orderEntry.DeliveryLines = new List<DeliverItemLines>();
orderDictionary.Add(orderEntry.id, orderEntry);
}
orderEntry.DeliveryLines.ad(orderDetail);
return orderEntry;
})
.Distinct()
.ToList();
retJson = JsonConvert.SerializeObject(list);
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(retJson, Encoding.UTF8, "application/json");
return ResponseMessage(response);
}
}
交货项目
public class DeliverysItems
{
[Key]
public int id { get; set; }
public string SopOrderNumber { get; set; }
public string CustomerName { get; set; }
public int DeliveryDriverId { get; set; }
public decimal OrderTotal { get; set; }
public string TelephoneNumber { get; set; }
public string EmailAddress { get; set; }
public int hasBeenDelivered { get; set; }
public List<DeliverItemLines> DeliveryLines { get; set; }
}
交货线类。
public class DeliverysItems
{
[Key]
public int id { get; set; }
public string SopOrderNumber { get; set; }
public string CustomerName { get; set; }
public int DeliveryDriverId { get; set; }
public decimal OrderTotal { get; set; }
public string TelephoneNumber { get; set; }
public string EmailAddress { get; set; }
public int hasBeenDelivered { get; set; }
public List<DeliverItemLines> DeliveryLines { get; set; }
}
}
我需要上面的例程来工作,如果订单没有订单行,它仍然会显示最高订单标题的详细信息。我认为我在sql中遗漏了一些东西,因为这应该很简单。
在最小的时候,我的应用程序显示以下内容。
何时应显示数据中的两条记录。
问题出在您的SQL中。 INNER JOIN
需要一场比赛。在这种情况下,根据您的ON子句,匹配在Deliverys.id
和DeliveryLines.DeliveryId
之间。
如果您希望在结果中包含交货,请使用LEFT JOIN
,即使交货没有交货行。另外,请准备好您的交付行字段返回NULL,这是在LEFT JOIN匹配尝试中不存在行时对这些列的期望。