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

问题描述

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

共有三个表: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 表中获取成分列表.IngredientAmount 值,并用它替换我引入的每个成分的成分.数量属性,但保持成分对象可识别为成分。

所以如果我像这样把它带进来,我就会得到我的配料清单。由于每种成分的数量保存在不同的字段中,因此该信息会丢失(认值为 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;

如果更多上下文有帮助,这个问题有界面图片和不久前页面的完整代码Datagrid from list crashes when item selected

解决方法

我想通了。我使用正确的 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);
          }