我正在处理一个配方管理器程序,首先使用Entity Framework 6代码。我有以下实体在数据库:LINQ表达式组合/加入
public class Item {
[DatabaseGenerated(DatabaseGeneratedOption.Identity), Key]
public int ItemId { get; set; }
[Required]
public string ItemName {get; set; }
// Other properties
}
public class Recipe {
[DatabaseGenerated(DatabaseGeneratedOption.Identity), Key]
public int RecipeId { get; set; }
[Required]
public string RecipeName { get; set; }
public virtual ICollection<Ingredient> Ingredients { get; set; }
// Other properties
}
public class Ingredient {
[Key, Column(Order = 0)]
public int RecipeId { get; set; }
[ForeignKey("RecipeId")]
public virtual Recipe Recipe { get; set; }
[Key, Column(Order = 1)]
public int ItemId { get; set; }
[ForeignKey("ItemId")]
public virtual Item Item { get; set; }
public double Quantity { get; set; }
// Other properties
}
public class Meal {
[DatabaseGenerated(DatabaseGeneratedOption.Identity), Key]
public int MealId { get; set; }
[Required]
public string MealName {get; set; }
public virtual ICollection<Recipe> Recipes { get; set; }
public virtual IEnumerable<Ingredient> Ingredients() {
if (Recipes == null)
yield break;
foreach (var recipe in Recipes)
foreach (var ingredient in recipe.Ingredients)
yield return ingredient;
}
}
我的问题是在Meal
类的Ingredients
属性。那里的代码将返回制作膳食所需的所有配料列表,但我想返回一个组合列表。也就是说,如果餐中的一个配方需要2个鸡蛋,而另一个需要1个鸡蛋,则会返回两个鸡蛋入口。我想返回一个3个鸡蛋的入口。
有没有可用于组合这些的LINQ表达式?东西等同于:
SELECT item.ItemName, SUM(ing.Quantity)
FROM Meals AS m
JOIN RecipeMeals AS rm ON m.MealId = rm.Meal_MealId
JOIN Ingredients AS ing ON rm.Recipe_RecipeId = ing.RecipeId
JOIN Items AS item ON ing.ItemId = item.ItemId
GROUP BY item.ItemName
这是行不通的。实体模型没有用于“RecipeMeals”表的实体。 –
你是什么意思,'实体模型没有用于RecipeMeals表的实体'?你不能添加它吗?我在这里发布的是你的SQL查询到Linq的确切转换。 – schlonzo
我首先使用实体框架代码。我在第一个列表中创建了类,然后添加了一个从'DbContext'降序的类来构建实体模型。模型中没有任何类用于多对多关系表。相反,有导航属性。 –