Я начинаю с 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();
Но я не думаю, что это умный способ сделать трюк... И я не понимаю, чего мне не хватает...
Может ли кто-нибудь помочь?
Если я правильно вас понимаю, вы пытаетесь найти ингредиенты на основе идентификатора продукта. Как вы знаете, свойство 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 - это то, что вы ищете.