在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();
但我不认为这是一个聪明的方式来做这个把戏。。。我不明白我错过了什么。。。
有人能帮忙吗?
如果我理解正确,您正试图根据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。