Ошибка: «Лямбда дерева выражений не может содержать нулевой распространяющий оператор» для Linq с from - PullRequest
0 голосов
/ 28 марта 2020

Я получаю следующую ошибку, когда пишу следующее Linq - может кто-нибудь предложить мне написать то же самое без получения ошибки. Мой Linq выглядит следующим образом:

                myOrphanList =
                        (
                            from v in allViolations
                            from r in allInspectionResults
                            from i in allItems
                            where
                                r.InspectionResultId == i.InspectionResultId &&
                                i.InspectionItemId == v.InspectionItemId
                            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,
                                InspectedCompanyName = (from a in contacts where a.ContactId == r.InspectedCompanyDataId select a.FirstName)?.FirstOrDefault()
                            }
                        ).ToList();

В строке "InspectedCompanyName = (из контактов, где a.ContactId == r.InspectedCompanyDataId выберите a.FirstName) ?. FirstOrDefault ()" Я получаю следующее ошибка - как мне от нее избавиться - спасибо

An expression tree lambda may not contain a null propagating operator

Любая помощь, пожалуйста

1 Ответ

0 голосов
/ 28 марта 2020

Это странное правило 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, он вернет пустую коллекцию, так какой смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...