2010-05-22 2 views
1

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

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

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

ответ

3

Я думаю, проблема в том, что в SQL функция SUM может возвращать значение null, а 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 к SQL генерирует результаты в нулевое значение для величины если нет деталей. Легкий способ определить, что это за проблема с такой ошибкой, - установить db.Log на Console.Out и скопировать сгенерированный SQL в SSMS и посмотреть, какие результаты. Вероятно, вы увидите, что сгенерированный SQL создает левое соединение, которое приводит к одному или нескольким нулевым значениям в столбце Количество. Либо это, либо будет подзапрос, который приведет к нулевому значению.

0

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

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

+0

Не должно быть нулевых ссылок, потому что запрос будет переведен в инструкцию SQL. И не должно быть никаких проблем с TotalQuantity. Сначала тип выводится так или иначе, а вторая сумма по пустой последовательности равна нулю. –

0

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

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

0

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

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

Смежные вопросы