[asp.net]Linq 枚举错误

标签: Asp.net Linq C#
发布时间: 2017/3/26 1:08:21
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我得到用户从已发布的表单数据,但有时它可能是空的。

var users = Request.Form.GetValues("users[]") == null ? null : Request.Form.GetValues("users[]").ToArray();

因此,用户将变为空,如果为空。但是,下面的 Linq 查询无法正常工作。

 var submissions = db.QuickSearchViews.Where(x => (users != null && users.Contains(x.UserId)))
                                      .ToList();

错误︰

附加信息︰ 无法创建类型为 null 常量值 'System.String []'。此上下文中,支持了只有实体类型、 枚举类型或基元类型。

解决方法 1:

我要去假设这是实体框架基于错误消息。 为什么此查询将引发一条错误消息的原因 (你没有张贴完整的错误和堆栈跟踪的记录,但它最有可能是 NotSupportedException ) 是双重的

  1. users不是在您的上下文内的实体 db (数据库映射) 并检查是否为 null 不能转换为 SQL 语句。

  2. users.Contains(x.userId)不能转换为 SQL 语句因为用户不是数据库的一部分。

您将需要重新排序的方式,这写的︰

var users = Request.Form.GetValues("users[]") == null ? null : Request.Form.GetValues("users[]").ToArray();
if(users != null)
{
     List<QuickSearchView> qsvs = db.QuickSeachViews.ToList();
     var submississions = qsvs.Where(x => users.Any(x.UserId));
}
else
{
      //something when users is null
}

可能,这可能的工作,但我没有测试过和我不记得因为我最近没有试过这样的事情︰

var submissions = db.QuickSearchViews.Where(x => users.Any(x.UserId));

您可能需要调用类似 db.QuickSearchViews.Load(); 首先,你需要对其进行测试。

核心提示︰

如果你担心被空的用户则可以使用空合并运算符 ?? 。 既然你提到, users 为空时空你可以这样做︰

var users = (Request.Form.GetValues("users[]") ?? new string[0]).ToList();

这将确保用户永远不会是 null ,因此你不需要去检查一下。 然而,你甚至不需要调用 ToList() 上这或在你原来的职位以来 Request.Form.GetValues() 返回数组 ( string[] ),其中已经实现 IEnumerable<T> 要访问的 linq 扩展方法。

官方微信
官方QQ群
31647020