Ответ 1
Ошибка, которую вы получаете, отличается от того, который вы показываете здесь. Это метод, который принимает параметр с именем "источник". В диалоговом окне "Параметры Visual Studio" отключите "Только мой код", отключите "Шаг над свойствами и операторы" и включите "Включить исходный шаг .NET Framework". Убедитесь, что символы .NET можно найти. Тогда отладчик будет ломаться внутри метода .NET, если он не является вашим собственным. затем проверьте stacktrace, чтобы узнать, какое значение передано с нулевым значением, но не должно.
То, что вам нужно искать, - это значение, которое становится null
и предотвращает это. Если вы посмотрите на свой код, это может быть разрыв строки itemsal.Add
.
Изменить
Поскольку у вас, похоже, проблемы с отладкой вообще и LINQ, особенно, попробуйте помочь вам шаг за шагом (также обратите внимание на расширенный первый раздел выше, если вы все еще хотите попробовать классический способ, я не был полностью в первый раз):
- Сократите возможные сценарии ошибок, разделив код;
- Замените места, в которых может
null
быть что-то намеренно неnull
; - Если все не удается, перепишите оператор LINQ как цикл и пройдите по нему шаг за шагом.
Шаг 1
Сначала сделайте код более читаемым, разделив его на управляемые части:
// in your using-section, add this:
using Roundsman.BAL;
// keep this in your normal location
var nCounts = from sale in sal
select new
{
SaleID = sale.OrderID,
LineItem = GetLineItem(sale.LineItems)
};
foreach (var item in nCounts)
{
foreach (var itmss in item.LineItem)
{
itemsal.Add(CreateWeeklyStockList(itmss));
}
}
// add this as method somewhere
WeeklyStockList CreateWeeklyStockList(LineItem lineItem)
{
string name = itmss.Item.Name.ToString(); // isn't Name already a string?
string code = itmss.Item.Code.ToString(); // isn't Code already a string?
string description = itmss.Item.Description.ToString(); // isn't Description already a string?
int quantity = Convert.ToInt32(itmss.Item.Quantity); // wouldn't (int) or "as int" be enough?
return new WeeklyStockList(
name,
code,
description,
quantity,
2, 2, 2, 2, 2, 2, 2, 2, 2
);
}
// also add this as a method
LineItem GetLineItem(IEnumerable<LineItem> lineItems)
{
// add a null-check
if(lineItems == null)
throw new ArgumentNullException("lineItems", "Argument cannot be null!");
// your original code
from sli in lineItems
group sli by sli.Item into ItemGroup
select new
{
Item = ItemGroup.Key,
Weeks = ItemGroup.Select(s => s.Week)
}
}
Вышеприведенный выше код, конечно, из-за моей головы, потому что я не знаю, какие типы классов у вас есть, и, следовательно, не могу проверить код перед публикацией. Тем не менее, если вы отредактируете его до тех пор, пока он не будет правильным (если это не так из коробки), то у вас уже есть большой шанс, что фактическая ошибка становится намного яснее. Если нет, на этот раз вы должны по крайней мере увидеть другую стеклу (которую мы все еще ожидаем!).
Шаг 2
Следующим шагом является тщательная замена каждой части, которая может привести к исключению нулевой ссылки. Под этим я подразумеваю, что вы заменяете это:
select new
{
SaleID = sale.OrderID,
LineItem = GetLineItem(sale.LineItems)
};
с чем-то вроде этого:
select new
{
SaleID = 123,
LineItem = GetLineItem(new LineItem(/*ctor params for empty lineitem here*/))
};
Это создаст выход мусора, но сужает проблему еще дальше до вашей потенциальной линии нарушения. Сделайте то же, что и выше для других мест в операторах LINQ, которые могут закончиться null
(почти обо всем).
Шаг 3
Этот шаг вам нужно будет сделать сам. Но если LINQ терпит неудачу и дает вам такие головные боли и такой нечитаемый или трудно отлаживаемый код, подумайте о том, что произойдет со следующей проблемой, с которой вы столкнулись? И что, если он терпит неудачу в живой среде, и вы должны решить его под давлением времени =
Мораль: всегда хорошо учиться новым приемам, но иногда даже лучше вернуться к чему-то понятному и понятному. Ничего против LINQ, мне это нравится, но в этом конкретном случае дайте ему отдохнуть, исправьте его простым циклом и переименуйте его через полгода или около того.
Заключение
Собственно, нечего заключать. Я пошел немного дальше, чем обычно, с длинным расширенным ответом. Я просто надеюсь, что это поможет вам лучше решить проблему и даст вам некоторые инструменты, чтобы понять, как вы можете сузить трудно-отладочные ситуации, даже без усовершенствованных методов отладки (которые мы не обсуждали).