我有一个代表食谱所有成分的类
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;
}
}