【问题标题】:System.InvalidOperationException issue in LINQ expressionLINQ 表达式中的 System.InvalidOperationException 问题
【发布时间】:2021-10-13 05:54:21
【问题描述】:

当我运行以下 Linq 时:

var selectedProduct = db.Products.FirstOrDefault(a => a.ProductNr == productNr)?.Id;
model.PackTypes = db.Zones
                    .Where(az => az.ProductId == selectedProduct && az.StoragePrio > 0)
                    .ToList()
                    .DistinctBy(p => p.PackType)
                    .OrderBy(x => x.PackType)
                    .Select(x => new DropdownItemViewModel<int>
                                 {
                                     Id = (int)x.PackType,
                                     Name = x.PackType.Translate()
                                 });
return true;

我收到此错误:

System.InvalidOperationException: 'Nullable 对象必须有一个值。'在此代码 Id = (int)x.PackType,

现在我知道我必须做一个空检查,所以我尝试了这个:

if (x.PackType != null)
    return new DropdownItemViewModel<int>
    {
        Id = (int)x.PackType,
        Name = x.PackType.Translate()
    };
return null;

仍然不起作用,我的意思是我仍然有 NullCheck 的问题。

【问题讨论】:

  • 型号....请。
  • az.ProductId 可以在某个时候成为null 吗?如果没有,您为什么要进行该查询,而不是在selectedProduct == null 时提前退出?
  • 为什么在构建链式延迟方法查询的过程中调用 ToList?什么是 PackType 类型?是否可以使用简单的强制转换将其转换为整数?
  • 您似乎希望.Where(az =&gt; az.ProductId == selectedProduct &amp;&amp; az.StoragePrio &gt; 0 &amp;&amp; az.PackType != null) 过滤掉所有包含az.PackType == null 的条目。除非这里有其他为空的东西?
  • 如果你想在 Where 之后强制 Linq-To-Objects 不要使用 ToList 而是 AsEnumerable。这样,您不会一次将所有内容加载到内存中,但您可以使用延迟执行。

标签: c# linq nullreferenceexception


【解决方案1】:

这个查询更有效,不应该有所有提到的错误:

var query = 
    from p in db.Products
    where p.ProductNr == productNr
    join az in db.Zones on p.Id equals az.ProductId
    where az.StoragePrio > 0 && az.PackType != null
    select new { az.PackType };

model.PackTypes = query
    .Distinct()
    .OrderBy(x => x.PackType)
    .Select(x => new DropdownItemViewModel<int>
    {
        Id = (int)x.PackType,
        Name = x.PackType.Translate()
    })
    .ToList();

这个查询只发送一个,而不是两个数据库请求。而且所有的操作都是在服务器端完成的。

【讨论】:

  • 请提供一些解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 2023-03-09
  • 2019-08-09
  • 1970-01-01
相关资源
最近更新 更多