【问题标题】:Icollection does not contain a defintion for anyIcollection 不包含任何
【发布时间】:2019-08-09 08:37:26
【问题描述】:

美好的一天,我正在编写一个使用即时加载的代码,以使用Include 方法从Assigned 加载相关数据。我正在尝试获取IsAvailable 的值,以便从Assigned 访问数据并检查是否存在ReturnDate 值等于null 的记录。我不断收到错误提示

Icollection 不包含任何的定义

public ActionResult Index()
    {
        var item = db.Item.Include(h => h.Assigned).Select(b => new ItemViewModel
        {
            ItemID = b.ItemID,
            ItemName = b.ItemName,
            Category = b.Category,
            Description = b.Description,
            Model = b.Model,
            IsAvailable = !b.Assigned.Any(h => h.ReturnDate == null)
        }).ToList();

        return View(item);
    }

项目视图模型

public class ItemViewModel
{

    public int ItemID { get; set;}
    [Display(Name = "Item")]
    public string ItemName { get; set; }
    [Required(ErrorMessage = "Category is required")]
    public string Category { get; set; }
    public string Model { get; set; }
    public string Description { get; set; }
    public bool IsAvailable { get; set; }
}

物品类别

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Collections;

    namespace Inventoryproto3.Models
    {
        public class Item
        {

            public int ItemID { get; set; }
            [Required(ErrorMessage ="Please enter a title"),Display(Name ="Item")]
            public string ItemName { get; set;}
            [Required(ErrorMessage ="Category is required")]
            public string Category { get; set;}
            public string Model { get; set;}
            public string Description{get; set;}

            public ICollection Assigned { get; set; }


        }
    }

“System.Collections.Generic.ICollection”不包含“Any”的定义,并且找不到接受“System.Collections.Generic.ICollection”类型的第一个参数的可访问扩展方法“Any”(你是缺少 using 指令或程序集引用?

Screenshot of error

【问题讨论】:

  • 发布你的Item实体类。
  • 发布 exact 错误消息。你是using System.Linq; 吗?
  • 您是否包含 System.Linq? b.Assigned的类型是什么?
  • 我确实包含了 system.linq ,B.assigned 是一个 Icollection 属性
  • 您需要将您的属性定义为 generic ICollection 才能使用 LINQ 功能。例如:ICollection<Assigned>.

标签: asp.net-mvc entity-framework linq model-view-controller


【解决方案1】:

每个Item 都有一个属性Assigned,其类型为ICollection

如果您查看Queryable.Any 的定义,您会发现:

public static bool Any<TSource> (this IQueryable<TSource> source, 
       Expression<Func<TSource,bool>> predicate);

因此,Assigned 属性应该实现 ICollection&lt;TSource&gt;,其中 TSource 是您希望在集合中找到的实际类型。

正确的解决方案是更改属性Assigned 的类型,这样您就知道该集合只包含您期望的类型的项目。唉,你选择给我们很多不重要的信息,但是你忘了提到 Assigned 中的项目类别,所以我们假设它的类型是 MyClass

class MyClass
{
    public Datetime ReturnDate {get; set;}
    ...
}

class Item
{
     ...
     public ICollection<MyClass> Assigned {get; set;}
}

这将解决您的问题:Any(...) 有效,并且您确定人们只能将 MyClass 对象放入集合中。

如果您不想将集合限制为 MyClass 对象,您至少可以将自己限制为具有属性 ReturnDate 的类:

interface IMyInterface
{
    public Datetime ReturnDate {get; set;}
}

class Item
{
     ...
     public ICollection<IMyInterface> Assigned {get; set;}
}

如果您真的希望人们可以在集合中添加除 MyClass 对象之外的其他内容,我强烈建议您不要这样做,您必须指定您想要的内容:

  • 忽略集合中不是 MyClass 对象的项目?使用OfType
  • 只是希望没有人在收藏中放其他东西?使用Cast,但话又说回来:为什么不防止有人在类中放置不正确的对象,并定义ICollection&lt;MyClass&gt;

OfType 可能不起作用AsQueryable,在这种情况下,您应该使用AsEnumerable 将数据移动到本地进程。为 ICollection 正确使用正确类型的第三个原因。

IsAvailable = !b.Assigned.OfType<MyClass>().Any(h => h.ReturnDate == null);
IsAvailable = !b.Assigned.Cast<MyClass>().Any(h => h.ReturnDate == null);

第一个将忽略您收藏的其他类型的项目。如果您的集合中有另一种类型,则后者将引发异常(使其成为ICollection&lt;MyClass&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2018-08-12
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2019-10-07
    • 2017-08-13
    相关资源
    最近更新 更多