我是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;
但是我收到以下错误:
&#39;了System.Collections.Generic.ICollection&#39;才不是 包含&#39; ID&#39;的定义没有扩展方法&#39; ID&#39;接受一个 类型的第一个参数 &#39;了System.Collections.Generic.ICollection&#39;可以找到 (您是否缺少using指令或程序集引用?)。
当您尝试调用方法或访问不存在的类成员时会发生此错误
但是,如果我深入了解自动生成的代码,我可以看到公共财产&#39; ID&#39;宣布产品&#39;产品&#39;成分&#39;返回&#39;产品&#39;
的集合成分</ P>
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();
但我认为这不是一个聪明的方法来做这个伎俩......而且我不明白我错过了什么......
有人可以帮忙吗?
答案 0 :(得分:3)
如果我理解正确,您正在尝试根据产品ID查找配料。如您所知,Product属性是一个集合,而不是单个对象。
您需要的是根据产品ID过滤产品,您可以使用Any来过滤收集。
IQueryable<Ingredient> IngQuery = from i in db.Ingredient
where i.Product.Any(p => p.ID == ProdID)
select i;
这意味着:
如果其任何产品的ID等于ProdID,则寻找成分。
您还可以使用All,如果您要找的是:
如果所有产品的ID等于ProdID,请寻找成分。
IQueryable<Ingredient> IngQuery = from i in db.Ingredient
where i.Product.All(p => p.ID == ProdID)
select i;
<强> PS 强>
但是,根据您的解决方法,使用Any是您正在寻找的。 p>