表达式树lambda不能包含空传播算子表达式树lambda不能包含空传播算子(an expressi

2019-05-11 20:39发布

:行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<IActionResult> 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,
                  ....
                  ....
              };
    ....
    ....
 }

Answer 1:

你从引用的示例使用LINQ到对象,其中在查询中隐含lambda表达式被转换成代表 ...而您使用EF或相似,具有IQueryable<T> queryies,其中lambda表达式被转换成表达树木 。 表达式树不支持空条件操作符(或元组)。

只要做到这一点旧的方式:

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

(我相信空合并运算符是一个表达式树的罚款。)



Answer 2:

你的代码链接到应用List<T> List<T>实现IEnumerable<T>但不IQueryable<T> 。 在这种情况下,突起是在内存中执行并?. 作品。

你使用的是IQueryable<T>这完全不同的作品。 对于IQueryable<T>投影的表示被创建,并且您的LINQ提供程序决定如何在运行时用它做。 为了向后兼容的原因, ?. 不能在这里使用。

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



文章来源: an expression tree lambda may not contain a null propagating operator