在EF中浏览各种关系

本文关键字:关系 浏览 EF | 更新日期: 2023-09-27 18:20:34

我是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"声明了一个公共属性"ID",并且"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();

但我不认为这是一个聪明的方式来做这个把戏。。。我不明白我错过了什么。。。

有人能帮忙吗?

在EF中浏览各种关系

如果我理解正确,您正试图根据Product的ID查找Ingredients。正如您所知,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,则查找Ingredient。

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

PS

但是,根据您的变通方法,您需要使用Any。