Нижеприведенный запрос состоит из нескольких статей INNER JOIN
.Должна ли ссылка на исключение исключения пустой переменной
В таблице Student
есть много внешних ключей, которые заменяются именами в запросе. Я использую LEFT OUTER JOIN
запрос ниже. Обратите внимание, что MarkID
в Students
может быть null
. Это означает, что marksGroup.DefaultifEmpty()
может вернуться null
. Поэтому, если я помещаю только m
вместо m != null ? m.MarkName : "-- Not marked --"
в последней строке, код IMO должен генерировать исключение, когда m
имеет значение null, потому что я имею в виду эту переменную, но это не так. На примере, на котором я строю этот запрос, возникает исключение для компилятора. См. Код:
var result = from st in dbContext.Students where st.DepartmentID == 17
join d in dbContext.Departments on st.DepartmentID equals d.DepartmentID
join sv in dbContext.SoftwareVersions on st.SoftwareVersionID equals sv.SoftwareVersionID
join stat in dbContext.Statuses on st.StatusID equals stat.StatusID
join m in dbContext.Marks on st.MarkID equals m.MarkID into marksGroup
from m in marksGroup.DefaultIfEmpty()
select new
{
student = st.StudentName,
department = p.DepartmentName,
software = sv.SoftwareVersionName,
status = st.StatusName,
marked = m != null ? m.MarkName : "-- Not marked --"
};
Что мне не хватает. Я все еще новичок в терминах C# и LINQ.
'[...], если я ставлю только m [...]'. Ссылка на объект не вызовет исключения. Однако, выполняя любую операцию на нем, ** будет бросать один **. То есть, пытается вызвать метод или свойство. Например, 'отмеченное = m' не должно вызывать никаких исключений, вы просто ссылаетесь на объект. 'mark = m.MarkName', однако, должен вызывать ** NullReferenceException **, если' m == null'. –
Вы хотите сказать, что 'отмеченный = m' должен вызывать исключение? –
@MatiCicero Спасибо Мати. Это объясняет разницу между мной и примером. Я снова посмотрел на примерный код, и автор действительно попытался ссылаться на свойство нулевого объекта :) Cheers! – Celdor