LINQ 表达式中的 System.InvalidOperationException 问题

System.InvalidOperationException issue in LINQ expression

提问人:Lidprogsky 提问时间:8/9/2021 最后编辑:Lidprogsky 更新时间:8/9/2021 访问量:332

问:

当我运行以下 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 object must have a value.' 在此代码上 Id = (int)x.PackType,

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

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

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

C# LINQ NullReferenceException

评论

1赞 ProgrammingLlama 8/9/2021
模型。。。。请。
1赞 ProgrammingLlama 8/9/2021
可能在某个时候?如果没有,你为什么要做那个查询,而不是提前退出?az.ProductIdnullselectedProduct == null
5赞 8/9/2021
为什么在构建链式延迟方法查询的过程中调用 ToList?什么是PackType类型?它可以使用简单的强制转换转换为整数吗?
2赞 ProgrammingLlama 8/9/2021
似乎您想过滤掉其中的任何条目。除非这里还有其他空的东西?.Where(az => az.ProductId == selectedProduct && az.StoragePrio > 0 && az.PackType != null)az.PackType == null
3赞 Tim Schmelter 8/9/2021
如果要在 the 之后强制使用 Linq-To-Objects,请不要使用 but .这样一来,您就不会一次将所有内容加载到内存中,但可以使用延迟执行。WhereToListAsEnumerable

答:

2赞 Svyatoslav Danyliv 8/9/2021 #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();

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

评论

1赞 Peter Csala 8/9/2021
也请提供一些解释。