【发布时间】:2013-04-22 09:59:27
【问题描述】:
我有一个代表食谱所有成分的类
public class ViewRecipe
{
public string RecipeName { get; set; }
public string IngredientName { get; set; }
public double UnitWeight { get; set; }
public double TotalWeight { get; set; }
public ViewRecipe() { }
public ViewRecipe(string _RecipeName, string _IngredientName, double _UnitWeight, double _TotalWeight)
{
RecipeName = _RecipeName;
IngredientName = _IngredientName;
UnitWeight = _UnitWeight;
TotalWeight = _TotalWeight;
}
}(in reality there are a LOT more data members like quantity, weight, etc....)
实际的数据集是一个名为 ViewRecipeSummary 的列表,它看起来像这样:
RecipeName IngredientName
1 A
1 B
1 C
2 D
2 E
3 A
3 Z
我有一个找到 INGRIDENT (recipeGroup.Key) 的现有查询,我现在需要执行以下操作:
1- 找到所有含有该成分的食谱
2- 从我的数据中为这些食谱返回所有行
然后我需要在我的查询中使用它(所以它需要带有 LET 或其他东西)
假设我正在寻找所有共享成分 A 的食谱,我希望我的 LET 的最终结果(基于我上面显示的数据)看起来完全像这样:
RecipeName IngredientName
1 A
1 B
1 C
3 A
3 Z
所以对于任何含有成分 A(1 和 3)的食谱,返回这些食谱的所有行,这样我就有了我需要的所有成分。 这应该与我的 ViewRecipe 类采用相同的形式(不是一些新的 {RecipeName, List} 等...),它应该以相同的格式提供相同的数据行。
当前 LINQ 查询:
ViewFullRecipeGrouping = (
from data in ViewRecipeSummary
group data by data.RecipeName into recipeGroup
let fullIngredientGroups = recipeGroup.GroupBy(x => x.IngredientName)
select new ViewFullRecipe()
{
RecipeName = recipeGroup.Key,
RecipeIngredients = (
from ingredientGroup in fullIngredientGroups
select new GroupIngredient()
{
IngredientName = ingredientGroup.Key,
}
).ToList(),
ViewGroupRecipes = (
// THIS IS WHERE I NEED TO ADD MY CODE SO THAT I CAN USE THE RESULT BELOW
let a = .....
// BUT I HAVE NO CLUE HOW TO PERFORM SUCH A QUERY HERE
select new GroupRecipe()
{
// USE THE RESULTS FOUND TO GENERATE MY RECIPE GROUP
// BASED ON THE RESULTS FOUND ABOVE
RecipeName = a.key
}).ToList(),
}).ToList();
类似:
let a = ViewRecipeSummary.GroupBy(x => x.RecipeName)
.Where(g => g.Any(x => x.IngredientName == recipeGroup.Key))
.Select(g => new ViewRecipe()
{
RecipeName = g.Key,
IngredientName = g.Select(x => x.IngredientName)
})
但这会返回一个列表,我需要将它分解为相同的结构。
这里是使用的类:
public class GroupRecipe
{
public string RecipeName { get; set; }
public List<GroupIngredient> Ingredients { get; set; }
public GroupRecipe() { }
public GroupRecipe(string _recipeName, List<GroupIngredient> _ingredients)
{
RecipeName = _recipeName;
Ingredients = _ingredients;
}
}
public class GroupIngredient
{
public string IngredientName { get; set; }
public double UnitWeight { get; set; }
public double TotalWeight { get; set; }
public GroupIngredient() { }
public GroupIngredient(string _IngredientName, double _UnitWeight, double _TotalWeight)
{
IngredientName = _IngredientName;
UnitWeight = _UnitWeight;
TotalWeight = _TotalWeight;
}
}
public class ViewFullRecipe
{
public string RecipeName { get; set; }
public List<GroupIngredient> RecipeIngredients { get; set; }
public List<GroupRecipe> ViewGroupRecipes { get; set; }
public ViewFullRecipe() { }
public ViewFullRecipe(string _RecipeName, List<GroupIngredient> _RecipeIngredients, List<GroupRecipe> _ViewGroupRecipes)
{
RecipeName = _RecipeName;
RecipeIngredients = _RecipeIngredients;
ViewGroupRecipes = _ViewGroupRecipes;
}
}
【问题讨论】:
-
我假设您使用的是 ORM。哪一个以及您是如何生成 ORM 映射的?通常 ORM 映射会给你关联(它们是实际映射的类的属性)。请包括您的数据库模型类。
-
如果您只想选择成分为“A”的食谱,您的查询太复杂了。它可以更容易地完成。
-
我没有使用 ORM,也没有数据库(按说法),它是 List
格式的数据集合。至于它是否复杂,我不确定你的意思,这是一个预先存在的查询,它做了很多事情,我只需要插入到那里(我评论的地方)我要问的新部分寻求帮助。 -
好的,我明白了。顺便说一句,我没有使用纯 linq 来获得你的结果。
-
任何对我有用的东西在这一点上都是有用的......我迷路了:)