错误:对于带有 from 的 Linq,“表达式树 lambda 可能不包含空传播运算符”

Posted

技术标签:

【中文标题】错误:对于带有 from 的 Linq,“表达式树 lambda 可能不包含空传播运算符”【英文标题】:Error: "An expression tree lambda may not contain a null propagating operator" for Linq with from 【发布时间】:2020-07-08 22:20:34 【问题描述】:

当我编写以下 Linq 时,我收到以下错误 - 有人可以建议我在没有收到错误的情况下编写相同的内容。 我的 Linq 如下:

我的孤儿列表 = ( 从 v in allViolations 来自所有检查结果中的 r 从 i in allItems 在哪里 r.InspectionResultId == i.InspectionResultId && i.InspectionItemId == v.InspectionItemId 选择新的 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 =(从 a.ContactId == r.InspectedCompanyDataId 选择 a.FirstName 的联系人中)?.FirstOrDefault() ).ToList();

在“InspectedCompanyName = (from a in contacts where a.ContactId == r.InspectedCompanyDataId select a.FirstName)?.FirstOrDefault()”行 我收到以下错误 - 我怎样才能摆脱它 - 谢谢

表达式树 lambda 可能不包含空传播运算符

请帮忙

【问题讨论】:

删除?.,之前的查询永远不会返回null。如果没有满足条件的项目,它将返回空集合。 您很可能还想在FirstOrDefault 之后使用?. 来访问属性。 【参考方案1】:

这是一个奇怪的 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 指出的那样,这里的逻辑很奇怪。一个选择查询(我放入firstName 的那个)永远不会返回null,它会返回一个空集合,那么有什么意义呢?

【讨论】:

以上是关于错误:对于带有 from 的 Linq,“表达式树 lambda 可能不包含空传播运算符”的主要内容,如果未能解决你的问题,请参考以下文章

“表达式树可能不包含使用可选参数的调用或调用”在带有拆分字符串实体的 LINQ 表达式中?

LINQ 表达式树是正确的树吗?

构建 LINQ 表达式树:如何获取范围内的变量

如何创建 LINQ 表达式树以选择匿名类型

具有嵌套属性的动态 linq 表达式树

无法让 double.TryParse 在 Linq 表达式树中工作