Icollection не содержит определения для любого - PullRequest
0 голосов
/ 19 марта 2019

Добрый день, я пишу код, используя готовую загрузку, чтобы загрузить связанные данные из Assigned, используя метод Include.Я пытаюсь получить значение для IsAvailable, чтобы получить доступ к данным из Assigned и проверить, есть ли запись, значение которой ReturnDate равно нулю.Я продолжаю получать сообщение об ошибке, говоря, что

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);
    }

ItemViewModel

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', и нет доступного метода расширения 'Any', принимающего первый аргумент типа 'System.Collections.Generic.ICollection'.найдено (отсутствует директива using или ссылка на сборку?

Снимок экрана с ошибкой

1 Ответ

0 голосов
/ 20 марта 2019

Каждый Item имеет свойство Assigned, которое имеет тип ICollection.

Если вы посмотрите на определение Queryable.Any , вы найдете:

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

Поэтому свойство Assigned должно реализовывать ICollection<TSource>, где 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<MyClass>?

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<MyClass>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...