【问题标题】:Linq Enumeration ErrorLinq 枚举错误
【发布时间】:2016-02-03 02:02:28
【问题描述】:

我从发布的表单数据中获取用户,但有时它可能是空的。

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

因此,如果用户为空,则用户变为 null。但是,下面的 Linq 查询不起作用。

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

错误:

附加信息:无法创建类型为空的常量值 '系统.字符串 []'。只有实体类型、枚举类型或原语 在此上下文中支持类型。

【问题讨论】:

  • 能否请您也发布堆栈跟踪?另外,这是实体框架吗?如果是这样,我会发布一个答案。
  • 也许不使用Contains(),而是使用Any()。见here
  • 这是使用var 关键字会降低可读性的一种情况。你真的应该显示完整的类型或向我们提供minimal reproducible example

标签: c# asp.net linq linq-to-entities


【解决方案1】:

我将假设这是基于错误消息的实体框架。此查询引发错误消息(您没有发布完整的错误和堆栈跟踪,但很可能是NotSupportedException)的原因是双重的

  1. users 不是您的上下文 db(数据库映射)中的实体,并且无法将其是否为空的检查转换为 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(); 之类的东西,但您需要对其进行测试。

专业提示:

如果您担心用户为空,可以使用null coalescing operator ??。既然您提到 users 为空时为空,您可以这样做:

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

这将确保用户永远不会是null,因此您不需要检查它。但是,您甚至不需要在此帖子或您的原始帖子中调用 ToList(),因为 Request.Form.GetValues() 返回一个数组 (string[]),它已经实现了 IEnumerable&lt;T&gt; 以访问 linq 扩展方法。

【讨论】:

  • 不只是检查users 是否为空,而是尝试在每次迭代 中检查它是否为空。对我来说似乎很粗略。
  • @DrewKennedy 没错。在这种情况下,不仅是不必要的,而且实际上是不可能翻译的查询。请记住,由于这不是 linq-to-objects 它实际上并没有遍历每个节点/记录;它让数据库代替它。
【解决方案2】:

users 不是模型的一部分,因此 linq to entity 正在尝试将其转换为 sql,并且对于查询,它被转换为常量,然后失败。考虑比较 users==null 是在 sql 中而不是在 c# 中评估的,因此 linq 正在尝试编写整个句子。

我建议在没有用户时分配一个空列表而不是 null 并消除 users==null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2013-11-18
    • 2012-08-27
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多