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

问题 :线路price = co?.price ?? 0, price = co?.price ?? 0,在下面的代码中给出了我上面的错误。 但如果我删除? 来自co.? 它工作正常。 我试图按照他们使用的MSDN示例进行操作? 在线select new { person.FirstName, PetName = subpet?.Name ?? String.Empty }; select new { person.FirstName, PetName = subpet?.Name ?? String.Empty }; 那么,似乎我需要了解何时使用??? 什么时候不去。

错误

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

 public class CustomerOrdersModelView { public string CustomerID { get; set; } public int FY { get; set; } public float? price { get; set; } .... .... } public async Task ProductAnnualReport(string rpt) { var qry = from c in _context.Customers join ord in _context.Orders on c.CustomerID equals ord.CustomerID into co from m in co.DefaultIfEmpty() select new CustomerOrdersModelView { CustomerID = c.CustomerID, FY = c.FY, price = co?.price ?? 0, .... .... }; .... .... } 

您引用的示例使用LINQ to Objects,其中查询中的隐式lambda表达式转换为委托 …而您使用EF或类似的,使用IQueryable查询,其中lambda表达式转换为表达式树木 。 表达式树不支持空条件运算符(或元组)。

就这样做:

 price = co == null ? 0 : (co.price ?? 0) 

(我相信null-coalescing运算符在表达式树中很好。)

您链接的代码使用ListList实现IEnumerable但不实现IQueryable 。 在这种情况下,投影在存储器和?.执行?. 作品。

你正在使用一些IQueryable ,它的工作方式非常不同。 对于IQueryable ,将创建投影的表示,并且LINQ提供程序决定在运行时如何处理它。 出于向后兼容的原因, ?. 不能在这里使用。

根据您的LINQ提供程序,您可以使用plain . 仍然没有得到任何NullReferenceException