C# 如何在LINQ中选择多个包含项?
我的产品类别是C# 如何在LINQ中选择多个包含项?,c#,asp.net-mvc,linq,asp.net-mvc-4,C#,Asp.net Mvc,Linq,Asp.net Mvc 4,我的产品类别是 public class Product { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int ProductID { get; set; } public string ProductName { get; set; } public virtual ICollection<ProductColor> ProductC
public class Product
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ProductID { get; set; }
public string ProductName { get; set; }
public virtual ICollection<ProductColor> ProductColors { get; set; }
}
假设我的产品模型包含
ProductID ProductName
1 Product 1
2 Product 2
3 Product 3
ProductID ColorID
1 1
1 2
2 3
我的颜色模型包含
ColorID ColorName
1 Red
2 Green
3 Blue
中间模型包含
ProductID ProductName
1 Product 1
2 Product 2
3 Product 3
ProductID ColorID
1 1
1 2
2 3
如何编写Linq查询以获取列表中每个产品的所有颜色 这应该满足您的需要:
var res = Products.Select(s => new{ Product = s, Colors = s.ProductColors.Select(m => m.Color) }).ToList();
这将生成具有两个属性的匿名类型:Product
和该产品具有的Color
s数组
或者您可以删除ProductColor
实体,将Product
更改为:
public class Product
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ProductID { get; set; }
public string ProductName { get; set; }
public virtual ICollection<Color> Colors { get; set; }
}
public class Color
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ColorID { get; set; }
public string ColorName { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
然后您就已经有了带有颜色的产品了。Ok。
这就是我要找的
var Colors = context.Products.SelectMany(p => p.Colors);
并按ProductID进行筛选
var Colors = context.Products.Where(p => p.ProductID == 1).SelectMany(p => p.Colors);
你有多对多的关系。使用EF,您不必在上下文中包含ProductColor
实体。那么你就不需要任何查询就可以得到你想要的东西了。@ieagle我真的被这个问题困住了。我不能在我的上下文中包含中间实体。你是什么意思ProductColor
是您的链接实体,它似乎已经被添加(从您的代码判断)。我想我做错了什么,因为我得到了错误…'Models.Products不包含“ProductColor”的定义,并且找不到接受类型为“Models.Products”的第一个参数的扩展方法“ProductColor”(您是否缺少using指令或程序集引用?看起来中间表隐藏在实体框架内。无论如何,问题已经解决,您的答案非常有用。我确实解决了问题,请检查我发布的答案。我只是不太明白为什么中间表“隐藏”.我最好从你发布的链接开始阅读。谢谢你的努力。祝你愉快:)