c# - 当我的查询没有找到任何项目时,它应该返回 null 吗?

标签 c# asp.net-mvc linq entity-framework

我有一个多选列表,用户可以在其中选择一些或不选择输入电压。当用户不选择 InputVoltages 时,当我调用 .Tolist() 时,我的查询会抛出 null 异常。为什么我不只是返回一个空列表?

我正在使用 MVC5 C# 和 Entity Framework 6。

存储库

public IQueryable<InputVoltage> All
{
    get { return context.InputVoltages; }
}

Controller

var newInputVoltages = unitOfWorkPds.InputVoltageRepository
    .All.Where(m => engineeringPdsEditViewModel.SelectedInputVoltages
        .Contains(m.Id))
    .ToList<InputVoltage>();

All 确实返回一个列表,但当未选择任何内容时,SelectedInputVoltages 为 null。我想知道这是否是问题所在。

当我使用此查询并为索引页添加 where 语句时,我在调用 ToList 时不会收到 null 错误

IQueryable<EngineeringPdsIndexViewModel> query = 
    (from a in context.EngineeringPds
     select new EngineeringPdsIndexViewModel
     {
         Id = a.Id,
         Name = a.Name,
         Status = a.Status,
         AnnualQuantities = a.AnnualQuantities,
         ToMarketDate = a.ToMarketDate,
         SubmittedBy = a.SubmittedBy,
         TargetPrice = a.TargetPrice
     });

所以我相信布莱恩对问题的看法是正确的,但问题是扩展的 我有一个多选框,在 get 操作方法中填充为

    IList<InputVoltage> inputVoltagesList = unitOfWorkPds.InputVoltageRepository.All.ToList();

然后

pdsEditViewModel.InputVoltageList = inputVoltagesList.Select(m => new SelectListItem { Text = m.Name, Value = m.Id.ToString() });  in my view I <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ddb5bcab9d95a9b0b1f391b4aea99fb2a59bb2af" rel="noreferrer noopener nofollow">[email protected]</a>(m => m.SelectedApprovals, Model.ApprovalList)

但是当用户没有做出任何选择时,selectedInputVoltages 会作为 null 进入我的后 Controller 操作,我如何让它作为空列表进入?

更新

对于遇到同样问题的人,布莱恩斯的第一个回答解释了这个问题。可以在此处找到提交带有空列表的列表框的解决方法

How can I return an empty list instead of a null list from a ListBoxFor selection box in Asp.net MVC?

最佳答案

BCL 中为 IEnumerable<T> 定义的任何扩展方法或IQueryable<T>返回 IEnumerable<T>IQueryable<T>不会返回 null。它可能返回一个空集合,但这与 null 有很大不同。

试试这个:

var newInputVoltages = engineeringPdsEditViewModel.SelectedInputVoltages == null ?
    unitOfWorkPds.InputVoltageRepository.All : 
    unitOfWorkPds.InputVoltageRepository.All.Where(m => engineeringPdsEditViewModel.SelectedInputVoltages.Contains(m.Id)).ToList();

关于c# - 当我的查询没有找到任何项目时,它应该返回 null 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19730790/

相关文章:

c# - 从点画直线

c# - 以编程方式将列添加到 WPF 中的 ListView ?

asp.net-mvc - 将外部登录链接到现有用户

c# - 如何在linq C#中使用多个条件

c# - 使用 Linq to XML 创建 KML

c# - 系统.MissingMethodException : Method 'Android.Support.V4.Widget.DrawerLayout.AddDrawerListener' not found

c# - EF 向后兼容的数据库迁移

javascript - 如何加快 Angular/Mvc.net 的图像加载速度

c# - 无法将类型 'System.Linq.IQueryable<int>' 隐式转换为 'int?'

c# - 如何使用 FtpWebResponse 创建 WebException 进行测试?