Перейдите через отношения в EF

1

Я начинаю с EF, поэтому мой вопрос, вероятно, базовый, но я не мог найти ответа...

У меня есть SQL Compact DB, из которого я создал модель сущности с помощью мастера VS. Все кажется прекрасным, я извлекаю все свои отношения с хорошим картографированием.

Итак, как я понимаю из этого: http://msdn.microsoft.com/en-us/library/bb386932(v=vs.110).aspx Я должен быть в состоянии сделать это, "запрос через отношения":

IQueryable<Ingredient> IngQuery = from i in db.Ingredient
            where i.Product.ID == ProdID
            select i;

Но я получаю следующую ошибку:

"System.Collections.Generic.ICollection" не содержит определения для "ID", и не существует метода "ID" расширения, принимающего первый аргумент типа "System.Collections.Generic.ICollection" (вам не хватает директивы using или ссылку на сборку?).

Эта ошибка возникает при попытке вызова метода или доступа к члену класса, который не существует

Однако, если я углубился в автоматически сгенерированный код, я могу увидеть, что для 'Product' объявлен идентификатор публичного имущества, а "Ingredient" возвращает коллекцию "Product":

  • Ингредиент

    public partial class Ingredient
    {
        public Ingredient()
        {
            this.Product = new HashSet<Product>();
        }
    
        public string Name { get; set; }
        public int ID { get; set; }
    
        public virtual ICollection<Product> Product { get; set; }
    }
    
  • Продукт

    public partial class Products
    {
        public Products()
        {
            this.Ingredient = new HashSet<T_PROPSTHERAP>();
        }  
        public int ID { get; set; }
        public string Name { get; set; }
        public string Usage { get; set; }
        public byte[] Photo { get; set; }
        public int FK_OrganeProduct { get; set; }
        public int FK_Type { get; set; }
        public virtual OrganeProduct OrganeProduct { get; set; }
        public virtual Type Type { get; set; }
        public virtual ICollection<Ingredient> Ingredient { get; set; }
    }
    

Но это не работает, как я ожидал.

В качестве обходного пути я могу использовать следующее:

List<Ingredient> lstIng = (_oTest.Products
                    .Where(p => p.Name == (string)lsbProducts.SelectedItem)
                    .SelectMany(p => p.T_PROPSTHERAP)).ToList();

Но я не думаю, что это умный способ сделать трюк... И я не понимаю, чего мне не хватает...

Может ли кто-нибудь помочь?

Теги:
entity-framework

1 ответ

3
Лучший ответ

Если я правильно вас понимаю, вы пытаетесь найти ингредиенты на основе идентификатора продукта. Как вы знаете, свойство Product представляет собой коллекцию, а не особый объект.

Вам нужна фильтрация продуктов на основе идентификатора продукта, вы можете использовать Any для фильтрации коллекции.

IQueryable<Ingredient> IngQuery = from i in db.Ingredient
            where i.Product.Any(p => p.ID == ProdID)
            select i;

Это значит:

Ищите ингредиент, если любой из его продуктов имеет идентификатор, равный ProdID.

Вы также можете использовать All, если вы ищете:

Ищите ингредиент, если все его продукты имеют идентификатор, равный ProdID.

IQueryable<Ingredient> IngQuery = from i in db.Ingredient
            where i.Product.All(p => p.ID == ProdID)
            select i;

PS

Однако, исходя из вашего обходного пути, использование Any - это то, что вы ищете.

  • 0
    Большое спасибо! :) Это именно то, что я ожидал!
  • 0
    @ Левенбрех, пожалуйста, не забудьте пометить его как ответ, если это поможет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню