Ваше обновление помогло мне понять вашу настоящую озабоченность.В отношении запросов LINQ вам необходимо знать концепцию отложенного выполнения в LINQ .
Для получения более подробной информации перейдите по ссылкам ниже:
Что такоеПреимущества отложенного выполнения в LINQ?
Linq - Какой самый быстрый способ узнать отложенное выполнение или нет?
Что теперь происходит в вашем случае?Вы сохранили свой запрос в переменной location
.Этот конкретный шаг - только часть инициализации.На самом деле он не выполняет запрос к вашей базе данных через слой ORM.Вот как вы можете это проверить.
Поставьте точку останова на строке кода, где вы инициализируете переменную location
запросом LINQ.Когда отладчик остановится в Visual Studio, перейдите в SQL Server Management Studio (SSMS) и запустите сеанс SQL Server Profiler.
Теперь нажмите F10 в Visual Studio, чтобы перейти к инструкции кода.На данный момент вы не увидите абсолютно никакого выполнения запроса в сеансе профилировщика, как показано ниже:
Это все потому, что запрос LINQ этого не сделалвыполняются вообще до этого момента времени.
Теперь вы достигаете строки кода ниже:
foreach (var item in location)
{
var p = item.EquipmentClass.EquipmentType.Name;
}
В тот момент, когда вы входите в цикл foreach, запрос LINQ запускается, и выВы увидите соответствующий журнал в сеансе трассировки в SQL Server Profiler.Таким образом, запрос LINQ не запускается, если он не перечисляется.Это называется отложенным выполнением, т.е. среда выполнения откладывает выполнение до перечисления.Если вы никогда не перечислите переменную location
в своем коде, тогда выполнение запроса никогда не произойдет вообще.
Поэтому, чтобы ответить на ваш запрос, исключение наступит только тогда, когда запрос будет запущен.Не раньше!
Обновление 1 : Вы говорите, что - Я не получаю исключение нулевой ссылки .Да!вы будете не получать нулевое ссылочное исключение, пока не достигнете записи, соответствующая присоединенная запись RHS отсутствует.Посмотрите на приведенный ниже код для лучшего понимания:
class Program
{
static void Main(string[] args)
{
var mylist1 = new List<MyClass1>();
mylist1.Add(new MyClass1 { id = 1, Name1 = "1" });
mylist1.Add(new MyClass1 { id = 2, Name1 = "2" });
var mylist2 = new List<MyClass2>();
mylist2.Add(new MyClass2 { id = 1, Name2 = "1" });
var location = from l in mylist1
join e in mylist2 on l.id equals e.id into rs1
from e in rs1.DefaultIfEmpty()
//where ids.Contains(l.ID)
select new
{
EquipmentClass = e,
InServiceStatus = e == null ? 1 : e.id,
EquipmentType = e.id
};
foreach (var item in location)
{
}
}
}
class MyClass1
{
public int id { get; set; }
public string Name1 { get; set; }
}
class MyClass2
{
public int id { get; set; }
public string Name2 { get; set; }
}
Итак, теперь, когда я начинаю итерацию переменной location
, она не прерывается на первой итерации.Это ломается во второй итерации.Он прерывается, когда не удается получить запись / объект, соответствующий MyClass1
объекту, имеющему id
2 в mylist1
.mylist2
не имеет объектов с id
2. Надеюсь, это поможет!