LINQ to SQL 如何连接两个表,从一个表中获取完整的 class 对象,但从另一个表中替换一个字段

LINQ to SQL How to join two tables, get the full class object from one but replace one field from the other

我正在开发一个程序,可以将食谱转换为更健康的版本。它有常规成分和更健康的成分,人们输入他们的食谱,它会提出更健康的替代品建议。

一共有三个 table:Ingredient、Recipe 和 IngredientList,其中包含每个食谱的配料列表和每种配料的用量。我正在使用 LINQ to SQL。这是配料表。

[IngrListId]       INT        IDENTITY (1, 1) NOT NULL,
[RecipeId]         INT        NOT NULL,
[IngredientId]     INT        NOT NULL,
[IngredientAmount] FLOAT (53) NOT NULL,
 PRIMARY KEY CLUSTERED ([IngrListId] ASC),
 CONSTRAINT [FK_IngredientList_Recipe] FOREIGN KEY ([RecipeId]) REFERENCES [dbo].[Recipe] ([RecipeId]),
 CONSTRAINT [FK_IngredientList_Ingredient] FOREIGN KEY ([IngredientId]) REFERENCES [dbo].[Ingredient] ([IngredientId])

我的问题是保存后如何编辑食谱。我可以带回所有的食谱字段和配料列表,但我不知道如何带回配料并将它们与正确的数量相匹配。或者更确切地说,我确实知道怎么做,但如果我以我知道的方式这样做,它就不再是成分列表,而是不是成分的新项目的列表,而且我无法再添加新的该列表的成分。

我只需要从 IngredientLists table 中获取 ingredientLists.IngredientAmount 值,并用它替换我带来的每种成分的 ingredients.Amount 属性,但保留可识别为成分的成分对象。

所以如果我像这样把它带进来,我就会得到我的配料清单。由于每种成分的数量保存在不同的字段中,该信息丢失(默认为 1),但数据网格有效,我可以使用其余部分已经工作的代码正常添加和编辑成分页面。

var ingrlist = from ingredients in dbContext.Ingredients
      join ingredientLists in dbContext.IngredientLists on ingredients.IngredientId equals ingredientLists.IngredientId
      where ingredientLists.RecipeId == rid
      select ingredients;
dgvRegIngrList.DataSource = ingrlist;

如果我使用此代码,我可以提取正确的数量,但它不再是成分列表。如果我现在尝试使用为成分设计的界面向列表中添加新成分或编辑现有成分之一,我会收到错误消息。

var ingrlist = from ingredients in dbContext.Ingredients
                               join ingredientLists in dbContext.IngredientLists on ingredients.IngredientId equals ingredientLists.IngredientId
                               where ingredientLists.RecipeId == rid
                               select new
                               {
                                   ingredients.IngredientId,
                                   ingredients.Name,
                                   ingredients.Units,
                                   ingredientLists.IngredientAmount,
                                   ingredients.Calories,
                                   ingredients.Fat,
                                   ingredients.Carbs,
                                   ingredients.Protein,
                                   ingredients.Discriminator
                               };

                dgvRegIngrList.DataSource = ingrlist;

这个问题有一张界面图片和不久前页面的完整代码,如果更多上下文有帮助的话。

我明白了。我得到具有正确 RecipeID 的 IngredientList,然后执行 foreach 循环以获得每种成分的正确数量。完美运行。我可以添加和编辑配料,因为它们是合适的配料,但它们的数量是正确的。

是的,我正在使用 LINQ to SQL。这就是我找到的教程,所以这就是我开始使用的。如果有其他更新或更好的东西,我会在我的下一个项目中尝试,但我非常致力于这个。

var ingrlist = from il in dbContext.IngredientLists where il.RecipeId == rid select il;

       foreach (var ing in ingrlist)
          {
            var ingr = (from r in dbContext.Ingredients where r.IngredientId == ing.IngredientId select r).First();
            ingr.Amount = ing.IngredientAmount;
            selectedIngredients.Add(ingr);
          }