以List形式获取子集合

2024-01-12

我有一个 LINQ to EF 查询,它以类形式返回数据。班级有一个List<RecipeCategories>我需要填充的属性。 RecipeCategories 表是Recipe 表和RecipeCategories 表之间的关系表,并且可以是多对多。我找到了足够的信息来编译代码,但它在运行时出错,并且我无法弄清楚如何正确执行此操作。

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 无法识别方法“System.Collections.Generic.List”1[RecipeCategoryItem] ToList[RecipeCategoryItem](System.Collections.Generic.IEnumerable1[RecipeCategoryItem])' 方法,并且该方法无法转换为存储表达式。

我正在研究的部分是这条线。

RecipeCategories = r.RecipeCategories.Select(i => new RecipeCategoryItem { Id = i.ID, CategoryName = i.categoryName }).ToList()

食谱类别是List<RecipeCategoryItem>财产。

我想做的事情是否可能,如果可以,如何做?

谢谢。


您在变成更大查询的内容中调用 ToList 。删除对 .ToList() 的调用。

问题是查询中的所有内容都会变成一个大表达式树,实体框架尝试将其转换为 SQL 语句。从 SQL 的角度来看,“ToList”没有任何意义,因此您不应在任何地方调用它inside您的查询。

在大多数情况下,您希望在返回整个查询之前调用 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,
                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,
            }).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();

请注意,最后一个示例将导致两次数据库访问,但会导致通过线路发送的数据较少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以List形式获取子集合 的相关文章

随机推荐