2017-05-03 56 views
0

我正在使用ASP.NET MVC,并且在使用实体框架在两个表之间进行联接时遇到问题。使用实体框架C与参考表进行联接#

在这种情况下,我有一个正在查询:

 return db.GENERIC_INGREDIENTS 
      .Where(genericIngredient => genericIngredient.STATUS_CODE_ID == enabledId) 
      .AsEnumerable() 
      .Select(genericIngredient => GenericIngredientToViewModelWithUnitLabel(genericIngredient, languageId)) 
      .OrderBy(genericIngredient => genericIngredient.Name); 

但我需要用表db.GENERIC_INGREDIENTS.INGREDIENTS一个连接,然后过滤器适用于CAN_BE_USED属性。我尝试了很多方法来做到这一点,但我遇到了问题。我想,我更接近我想要的查询如下:

 return db.GENERIC_INGREDIENTS 
     .Where(genericIngredient => genericIngredient.STATUS_CODE_ID == enabledId) 
     .AsEnumerable() 
     .Select(genericIngredient => GenericIngredientToViewModelWithUnitLabel(genericIngredient, languageId)) 
     .Join(db.INGREDIENTS, 
      gi => gi.Id, 
      i => i.GENERIC_INGREDIENT_ID, 
      (i, gi) => new { GENERIC_INGREDIENTS = gi, INGREDIENTS = i }) 
     .OrderBy(genericIngredient => genericIngredient.Name) 

的GenericIngredientToViewModelWithUnitLabel如下:

public GenericIngredientsViewModel GenericIngredientToViewModelWithUnitLabel(GENERIC_INGREDIENTS genericIngredient, int languageId = 0) 
    { 
     DBEntities db = new DBEntities(); 
     var genericIngredientTranslation = ReadGenericIngredientsTranslation(genericIngredient, languageId); 
     var unitLabelTranslation = UnitLabelsService.Service.ReadUnitLabelTranslationById(db, genericIngredient.UNIT_LABEL_ID, languageId); 
     return new GenericIngredientsViewModel 
     { 
      Id = genericIngredient.GENERIC_INGREDIENT_ID, 
      StatusCodeId = genericIngredient.STATUS_CODE_ID, 
      UnitLabelId = genericIngredient.UNIT_LABEL_ID, 
      Name = genericIngredientTranslation.GENERIC_INGREDIENT_NAME + " (" + unitLabelTranslation.Name+ ")", 
      Description = genericIngredientTranslation.GENERIC_INGREDIENT_DESCRIPTION, 
      Languages = genericIngredient.GENERIC_INGREDIENTS_TRANSLATIONS.Select(translation => translation.LANGUAGE_ID).ToList() 
     }; 
    } 

在这第二个查询将返回一个错误“匿名类型:主料GENERIC_INGREDIENTS ,GenericIngredientsViewModel不包含名称的定义。“。由于GenericIngredientToViewModelWithUnitLabel返回名称,所以这对我来说没有多大意义。此查询必须返回一个IEnumerable。

感谢您的任何帮助。

回答

0

我认为你必须修改的最后一行,以获取正确的名称:

return db.GENERIC_INGREDIENTS 
    .Where(genericIngredient => genericIngredient.STATUS_CODE_ID == enabledId) 
    .AsEnumerable() 
    .Select(genericIngredient => GenericIngredientToViewModelWithUnitLabel(genericIngredient, languageId)) 
    .Join(db.INGREDIENTS, 
     gi => gi.Id, 
     i => i.GENERIC_INGREDIENT_ID, 
     (i, gi) => new { GENERIC_INGREDIENTS = gi, INGREDIENTS = i }) 
    .OrderBy(output => output.GENERIC_INGREDIENTS.Name) 
+0

那不要工作:(。同样的错误 –

+0

@DanielSerrão上面提到的现有查询是否工作?如果是这样,那么根据查询'.Name'是你在最后命令的内容,它是属性o你的'GenericIngredientsViewModel'类。根据你的错误文本,它看起来像最后一个order by子句不能访问'.Name'属性,因为新创建的匿名类型没有它,所以上面的答案应该工作。你可以尝试省略'OrderBy'子句来确认错误是由于它吗?此外如果可能的话分享确切的错误信息。 – degant

0

为了解决不承认我只需要改名字的问题:

gi => gi.Id, 
    i => i.GENERIC_INGREDIENT_ID, 
    (i, gi) => new { GENERIC_INGREDIENTS = gi, INGREDIENTS = i }) 

gi => gi.GENERIC_INGREDIENT_ID, 
    i => i.GENERIC_INGREDIENT_ID, 
    (gi, i) => new { GENERIC_INGREDIENTS = gi, INGREDIENTS = i }) 

问题是参数的顺序,当做“OrderBy(output => output.GENERI C_INGREDIENTS.Name)“,我实际上试图从不存在的INGREDIENTS中获取名称。

但现在我有一个问题,结果返回许多重复。当前查询如下:

 return db.GENERIC_INGREDIENTS 
     .Join(db.INGREDIENTS, 
      gi => gi.GENERIC_INGREDIENT_ID, 
      i => i.GENERIC_INGREDIENT_ID, 
      (gi, i) => new { GENERIC_INGREDIENTS = gi, INGREDIENTS = i }) 
     .Where(output => (output.GENERIC_INGREDIENTS.STATUS_CODE_ID == enabledId) 
          && (output.INGREDIENTS.CAN_BE_USED == true) 
     .AsEnumerable() 
     .Select(output => GenericIngredientToViewModelWithUnitLabel(output.GENERIC_INGREDIENTS, languageId)) 
     .OrderBy(genericIngredient => genericIngredient.Name); 

此查询没有任何错误并返回正确的类型IEnumerable,但它返回许多重复项。我试着在SQL Server中的相同查询,它的作品完美:(

0

问题已解决。问题是,它存在许多不同的成分为同一generic_ingredient。要解决在SQL Server中我需要使用generic_ingredient_id“NOT IN” ingredients_ids,为了让使用EF,我们可能需要使用‘包含’我没有最终的解决办法,因为我做到了使用存储过程。

感谢您的帮助。