【问题标题】:Query LINQ don't work查询 LINQ 不起作用
【发布时间】:2014-09-24 10:59:44
【问题描述】:

我有一个不起作用的控制器方法。 方法是这样的:

public ActionResult Index(DateTime? data)
{
   var servizi = (Request["servizi"] ?? "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(n => Convert.ToInt32(n)).ToArray();


    if (servizi == null || servizi.Length == 0)
    {
        ModelState.AddModelError("servizi", "Selezionare almeno un servizio");
        return View();
    }

    var dati = this.GetDbContext().mensilizzazioni.Include(x => x.operatore).Include(x => x.utente).Where(x => x.data1 == data.Value && servizi.Contains(x.id_utente_servizi));

    dati = getProfiledDatas(dati.AsQueryable<mensilizzazioni>());


    return View();
}

这些是 LINQ servizi.Contains 上的错误:

  • Error2 'int []' 不包含 'Contains' 的定义和最佳扩展方法重载 'System.Linq.ParallelEnumerable.Contains (System.Linq.ParallelQuery , TSource)'

  • Error1 参数实例:无法从“int []”转换为“System.Linq.ParallelQuery”

请谁能帮帮我。谢谢!

【问题讨论】:

  • 你是using System.Linq;吗?
  • 是的,我正在使用 System.Linq
  • servizi 是我猜的整数数组类型,然后您在其上使用 contains 方法。
  • 您以var model = 开头的行缺少括号。您能否修复您的代码 - 或者更好地简化它以删除与问题无关的任何行?
  • 谢谢。不幸的是,我可以复制任何接近您的问题的唯一方法是从控制器顶部删除using System.Linq;,并且您已经声明它存在。对不起。

标签: .net asp.net-mvc linq asp.net-mvc-4 razor


【解决方案1】:

第一期:

您正在将传递的字符串转换为int 的数组,然后尝试对其运行Contains 方法(该方法在数组中不存在)。

改用ToList(),因为它有一个Contains 方法。

例如:

var servizi = (Request["servizi"] ?? "").Split(new[] { ',' },
    StringSplitOptions.RemoveEmptyEntries).Select(n => Convert.ToInt32(n)).ToList();

第二期:

由于您的成员变量原来是int?(即nullable&lt;int&gt;),您还需要更改第二个查询以使用id_utente_serviziValue 属性。

var dati = this.GetDbContext().mensilizzazioni.Include(x => x.operatore).Include(x => x.utente).Where(x => x.data1 == data.Value && servizi.Contains(x.id_utente_servizi.Value));

这假定id_utente_servizi 绝不是null。如果它可以 null 您可能需要将您的 Where 子句更改为:.Where(x =&gt; x.data1 == data.Value &amp;&amp; x.id_utente_servizi.HasValue &amp;&amp; servizi.Contains(x.id_utente_servizi.Value))

【讨论】:

  • 谢谢,但是使用 .ToList() 我有这个错误:-无法从“int?”转换to 'int', 'System.Collections.Generic.List .Contains (int)' 的最佳重载方法匹配有一些无效参数
  • 啊。不知道您的 id_utente_servizi 属性可能为空。已经更新了适合的答案:)
  • 哦,是的!它是如此简单......我真是个傻瓜:D
  • @Alessio De Castro:没问题。 LINQ 可以同时使用 LINQ to Entities 和 LINQ to objects 给出许多奇怪的结果。解决方案通常涉及ToList() :)
【解决方案2】:

x.id_utente_servizi 的类型是什么?确保它是一个 int。

如果我用错误的参数调用 .Contains,我会得到一个类似的错误:

servizi.Contains("not an int");

'int[]' 不包含 'Contains' 的定义,并且最佳扩展方法重载 'System.Linq.Queryable.Contains(System.Linq.IQueryable, TSource)' 有一些无效参数

实例参数:无法从 'int[]' 转换为 'System.Linq.IQueryable'

【讨论】:

  • 显示的错误int []' does not contain a definition for 'Contains' 只是因为变量servizi 是一个int 数组,它没有Contains 方法。有一个静态的Array.contains(),但在这里没有那么有用。
  • 是的,我确信“x.id_utente_servizi”是一个 INT
  • @TrueBlueAussie 如果你有 System.Linq 命名空间,那么你在所有 IEnumerable 上都有 .Contains 方法,包括 int[]。在我的示例中,如果我传入一个 int,它就可以工作。它说没有 .Contains 方法,因为我给了它错误的类型,试图重现 Alessio 的错误。
  • @AlessioDeCastro 所以它不是一个 int - 它是一个 int?。但是,我仍然没有得到与您完全相同的错误。
  • @LeonidTsybert 嗨,是的,它是一个 int,现在可以正常使用:servizi.Contains(x.id_utente_servizi.Value)) 我确实在 contains 方法参数和 ToList() 中放入了“.Value”在 var servizi
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多