【问题标题】:Does not contain definition for 'Contains'不包含“包含”的定义
【发布时间】:2016-11-30 17:15:52
【问题描述】:

它显示代码的“不包含 ID 定义”之类的错误

[HttpPost]
public ActionResult show(List<int> ids)
    {
        if (ids != null)
        {
            int[] brands = ids.ToArray();
            var brandId = _db.Brands.Where(p => brands.Contains(p.ID));
            var srtItems = _db.Products.Where(p => p.CategoryID == brandId.ID);

            return PartialView("_pView", srtItems);
        }
    }

对于以下代码,错误是'不包含包含的定义'

[HttpPost]
        public ActionResult show(List<int> ids)
        {
            if (ids != null)
            {
                int[] brands = ids.ToArray();
                var brandId = _db.Brands.Where(p => brands.Contains(p.ID));

                var sortItemss = _db.Products.Where(p => brandId.Contains(p.CategoryID));
                return PartialView("_pView", srtItems);
            }

请指导我

【问题讨论】:

  • @diiN_ 没错,否则他将无法使用Where

标签: c# asp.net-mvc linq


【解决方案1】:

这就是var 成为万恶之源的地方,因为它隐藏了真正的数据类型。删除 var,您会立即注意到问题:

int[] brands = ids.ToArray();
IQueryable<Brand> brandId = _db.Brands.Where(p => brands.Contains(p.ID));
IQueryable<Product> srtItems = _db.Products.Where(p => p.CategoryID == brandId.ID);

brandId 是一个序列(具体化时),它不是单个对象,因此它不包含ID 的定义。

要解决这个问题,您可以:

IQueryable<int> brandIds = _db.Brands.Where(p=> brands.Contains(p.ID)).Select(b=> b.ID);
IQueryable<Product> srtItems = _db.Products.Where(p=> brandIds.Contains( p.CategoryID));

获取检索记录的 ID,并通过这些 ID 进行匹配。

作为建议,不要使用var,除非真正的类型是多余的(意味着它显示在语句的其他部分)

【讨论】:

  • 不好的建议。您的var“替换”都将真实类型从IQueryable&lt;T&gt;更改为IEnumerable&lt;T&gt;
  • @IvanStoev 关于第二部分绝对正确,但不是关于建议!我这样做很匆忙,但是如果有人故意这样做,那确实意味着他不知道该方法返回什么。我猜我们不应该使用我们不知道其签名的方法。否则,我们需要充分理解IQueryableIEnumerable 之间的区别以及什么被执行在哪里和何时
  • @user3185569,先生,您能否解释一下 IEnumerable 和 IQueryable 之间的区别。我的意思是什么时候使用它们。
  • @pavan 这个问题已经有了很好的答案。其中之一:stackoverflow.com/questions/2876616/…
  • @user3185569,先生,可以请我指导一下这个问题,stackoverflow.com/questions/40944709/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2018-12-25
相关资源
最近更新 更多