Обработка исключений в Linq to SQL для клиентов без заказов - PullRequest
1 голос
/ 22 мая 2010

У меня есть следующий код для получения имени клиента, общей суммы (заказов), суммы (деталей заказа) для охвата клиента в базе данных Northwind. Проблема с приведенным ниже кодом заключается в том, что он вызывает исключение, поскольку у нескольких клиентов нет записей в таблице заказов.

Я знаю, используя синтаксис запроса (объединение), исключения можно избежать. Я хочу знать, может ли то же самое быть обработано с помощью синтаксиса метода расширения.

 var customerOrders = db.Customers
    .Select(c => new 
    { 
        CompanyName = c.CompanyName, 
        TotalOrders = c.Orders.Count(), 
        TotalQuantity = c.Orders
            .SelectMany(o => o.Order_Details).Sum(o=>o.Quantity) 
    });

Ответы [ 4 ]

3 голосов
/ 22 мая 2010

Я думаю, проблема в том, что в SQL функция SUM может возвращать ноль, а Ling-to-SQL ожидает int.Вы можете обойти это, выполнив это:

  TotalQuantity = 
    (int?)c.Orders.SelectMany(o => o.Order_Details).Sum(o=>o.Quantity)

и затем проверив наличие нулевых значений.Я думаю, что это также будет работать

  TotalQuantity = 
    ((int?)c.Orders.SelectMany(o => o.Order_Details).Sum(o=>o.Quantity)) ?? 0

, если вы хотите установить значение по умолчанию 0.

Причина, по которой это происходит, заключается в том, что SQL, генерируемый Linq-to-SQL, приводит к нулевому значениюдля столбца количества, когда нет подробностей.Простой способ определить причину этой ошибки - установить db.Log в Console.Out, скопировать сгенерированный SQL в SSMS и посмотреть, каковы результаты.Вероятно, вы увидите, что сгенерированный SQL создает левое соединение, что приводит к одному или нескольким нулевым значениям в столбце Количество.Либо так, либо будет подзапрос, который приведет к нулевому значению.

0 голосов
/ 22 мая 2010

Является ли Quantity обнуляемым? Я подозреваю, что именно там происходит исключение, поскольку все остальные случаи должны быть просто пустым перечислением, которое не вызовет нулевое исключение.

Сведения об исключении наверняка помогут!

0 голосов
/ 22 мая 2010

Синтаксис запроса очень приятный и переводится в методы расширения во время компиляции.Кроме того, методы расширения являются строго более мощными, поскольку нет синтаксиса запросов для всех методов расширения.Вы можете просто использовать Enumerable.Join для выполнения соединения с методами расширения.

Но я не могу определить проблему - я не ожидаю, что ваш код вызовет исключение.Что такое фактическое исключение и где оно происходит?

0 голосов
/ 22 мая 2010

Я не вижу исключения здесь, за исключением того, что customerOrders может быть нулевым.Что я упустил?Изменить: ОК, я вижу, что проблема в операторе SelectMany

Проблема может заключаться в том, что TotalQuantity не обнуляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...