ri = (from r in recipeData.Recipes where r.ID == recipeId select new RecipeItem { Id = r.ID,ProductId = r.Product.ID,RecipeName = r.recipeName,RecipeDescription = r.recipeDescription,Servings = r.servings.HasValue ? r.servings.Value : 0,CreatedDate = r.createdDate,PrepTime = r.prepTime.HasValue ? r.servings.Value : 0,CookTime = r.cookTime.HasValue ? r.servings.Value : 0,Approved = r.approved,RecipeInstructions = r.recipeInstructions,RecipeIngredients = r.recipeIngredients,RecipeCategories = r.RecipeCategories.Select(i => new RecipeCategoryItem { Id = i.ID,CategoryName = i.categoryName }).ToList() }).First();
这是我得到的错误.
LINQ to Entities does not recognize the method ‘System.Collections.Generic.List
1[RecipeCategoryItem] ToList[RecipeCategoryItem](System.Collections.Generic.IEnumerable
1[RecipeCategoryItem])’ method,and this method cannot be translated into a store expression.
我正在研究的部分是这一行.
RecipeCategories = r.RecipeCategories.Select(i => new RecipeCategoryItem { Id = i.ID,CategoryName = i.categoryName }).ToList()
RecipeCategories是List< RecipeCategoryItem>属性.
我正在尝试做什么,如果是这样,怎么样?
谢谢.
解决方法
问题是查询中的所有内容都变成了一个大的表达式树,实体框架试图将其转换为sql语句.从sql的角度来看,“ToList”没有任何意义,因此不应在查询中的任何位置调用它.
在大多数情况下,您希望在返回整个查询之前调用ToList,以确保评估查询并将结果加载到内存中.在这种情况下,您只返回一个对象,因此对First的调用基本上是相同的.
RecipeCategories是List< RecipeCategoryItem> ;?有多重要?如果你可以改为IEnumerable,那么你可以毫无问题地删除对ToList的调用. 如果您有一个List是绝对必要的,那么您首先需要使用初始实体框架查询和匿名类型(不调用ToList)来获取所有信息,然后将您收到的数据转换为您想要的对象类型归还它. 或者您可以从多个查询中逐步构建RecipeInfo对象,如下所示:
var ri = (from r in recipeData.Recipes where r.ID == recipeId select new RecipeItem { Id = r.ID,}).First(); var rc = from c in recipeData.RecipeCategories where c.Recipes.Any(r => r.ID == recipeId) select new RecipeCategoryItem { Id = c.ID,CategoryName = c.categoryName }; ri.RecipeCategories = ri.ToList();
请注意,最后一个示例将导致两次数据库跳闸,但会导致更少的数据通过线路发送.