Это странное правило LINQ. Проблема в выражении:
InspectedCompanyName = (from a in contacts where a.ContactId == r.InspectedCompanyDataId select a.FirstName)?.FirstOrDefault()
, которое находится внутри вашего выбора. ?.
не допускается.
К счастью, ?:
(троичный оператор / встроенный условный оператор) разрешен, поэтому его можно переписать. Для удобства вам понадобится let:
myOrphanList =
(
from v in allViolations
from r in allInspectionResults
from i in allItems
where
r.InspectionResultId == i.InspectionResultId &&
i.InspectionItemId == v.InspectionItemId
let firstName = from a in contacts // Pop your sub-query in a variable here
where a.ContactId == r.InspectedCompanyDataId
select a.FirstName
select new OrphanViolationsReport
{
ViolationId = v.ViolationId,
ViolationNumber = v.ViolationNumber,
ViolationDate = v.ViolationDate,
ViolationType = v.ViolationType.ViolationTypeCode,
ItemYear = i.ItemYear,
ItemMakeManufacturer = i.ItemMakeManufacturer,
ItemModel = i.ItemModel,
VIN = i.VIN,
PIN = i.PIN,
InspectionResultId = r.InspectionResultId,
InspectionResultNumber = r.InspectionRequestNumber,
DealerDmvNumber = r.DealerDmvNumber,
// USe ternary operator here
InspectedCompanyName = firstName == null ? null : firstName
}
).ToList();
Это слишком сложно для меня, чтобы протестировать компиляцию, но это в основном идея.
Тем не менее, как указывает @SalahAkbari, логика c здесь очень странно. Запрос выбора (тот, который я поместил в firstName
) никогда не вернет null
, он вернет пустую коллекцию, так какой смысл?