Возвращает только одну запись в наборе данных - PullRequest
0 голосов
/ 22 апреля 2019

Я использую ado .net в своем веб-API и dapper, и у меня есть функция, которая проверяет заказы и строки заказа, он работает нормально, если только один заказ, но если есть заказ без строк заказа, он не будет отображатьдетали заказа.

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, так как это должно быть легко.

Ибо, как минимум, мое приложение показывает следующее.

Когда это должнопоказывать две записи, которые здесь в данных.

enter image description here

1 Ответ

0 голосов
/ 22 апреля 2019

Проблема в вашем SQL.INNER JOIN требует совпадения.В этом случае это совпадение составляет от Deliverys.id до DeliveryLines.DeliveryId в соответствии с предложением ON.

Используйте LEFT JOIN, если хотите включить доставку в свои результаты, даже если доставка не имеет строк доставки.Кроме того, будьте готовы к тому, что в полях строк доставки появится значение NULL, что следует ожидать для тех столбцов, когда в попытке сопоставления LEFT JOIN не найдено ни одной строки.

...