【问题标题】:Test Null after FirstOrDefault在 FirstOrDefault 之后测试 Null
【发布时间】:2019-07-10 01:34:04
【问题描述】:

我在 EntityFrameworkCore 中有以下 Linq 表达式:

var models = await products.Select(product => new ProductModel {
  Id = product.Id,
  ProductType = new ProductTypeModel {
    Id = product.ProductType.Id,
    Name = product.ProductType
             .ProductTypesI18N
             .FirstOrDefault(y => y.LanguageCode == languageCode)?.Name
  }
}.ToListAsync()

我收到以下错误:

An expression tree lambda may not contain a null propagating operator.

如果 FirstOrDefault 返回 null,是否有不触发错误的捷径?

注意:
我认为这可能是比使用 FirstOrDefault 更好的方法。
例如,在以下代码行中:new ProductTypeModel {

【问题讨论】:

  • 尝试将整个表达式封装在括号中或封装到它自己的“var”变量中,然后添加 ?.Name。或者你可以使用 null colacing docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • @ZakkDiaz null cloaking 不起作用,我认为,因为我需要返回名称 ...
  • 这很奇怪,因为据我所知,您的空传播运算符不是表达式树 lambda 的一部分。该查询究竟是如何使用的?它是否在更大的查询中?
  • 如果 products 是来自 DbSet 的 IQueryable,则无需检查 null,因为查询是作为没有空引用概念的 SQL 执行的。跨度>

标签: c# linq entity-framework-core


【解决方案1】:

在您的 FirstOrDefault 之前选择您想要的 ProductType 的名称:

Name = product.ProductType.ProductTypesI18N
         .Where(productType => productType.LanguageCode == languageCode)
         .Select(productType => productType.Name)
         .FirstOrDefault(),

简单的祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多