浏览EF中的关系

时间:2014-09-03 14:32:40

标签: c# .net entity-framework

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

但我认为这不是一个聪明的方法来做这个伎俩......而且我不明白我错过了什么......

有人可以帮忙吗?

1 个答案:

答案 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是您正在寻找的。