2014-09-03 6 views
1

Я новичок с EF, поэтому мой вопрос, вероятно, основной, но я не мог найти ответ ...Navigate по отношениям в 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' does not contain a definition for 'ID' and no extension method 'ID' accepting a first argument of type 'System.Collections.Generic.ICollection' could be found (are you missing a using directive or an assembly reference?).

This error occurs when you try to call a method or access a class member that does not exist

Однако, если Я углубляюсь в автогенерируемый код, я вижу, что идентификатор общественной собственности объявляется для «Продукта», а «Ингредиент» возвращает коллекцию «Продукт»:

  • Ингредиент

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

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

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

ответ

3

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

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

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

Это означает, что:

Looking for Ingredient if any of its product has ID equals to ProdID.

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

Looking for Ingredient if all of its products have ID equals to ProdID.

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

PS

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

+0

М. Просто спасибо! :) Это именно то, что я ожидал! – Levenbrech

+0

@ Levenbrech, пожалуйста, не забудьте [отметить это как ответ] (http://meta.stackexchange.com/a/5235), если это поможет –

Смежные вопросы