Вы вызываете ToList внутри того, что превращается в более крупный запрос. Удалить вызов .ToList ().
Проблема в том, что все в вашем запросе превращается в большое дерево выражений, которое Entity Framework пытается преобразовать в оператор SQL. «ToList» не имеет смысла с точки зрения SQL, поэтому не следует называть его где-нибудь внутри вашего запроса.
В большинстве случаев вы хотите вызвать ToList для вашего общего запроса перед его возвратом, чтобы убедиться, что запрос оценен и результаты загружены в память. В этом случае вы возвращаете только один объект, поэтому вызов First
по сути делает то же самое.
Насколько важно, чтобы RecipeCategories был List<RecipeCategoryItem>
? Если вы могли бы сделать его IEnumerable вместо этого, то вы можете без проблем удалить вызов на ToList
.
Если абсолютно необходимо, чтобы у вас был List
, то вам сначала нужно получить всю информацию при использовании исходного запроса Entity Framework и анонимных типов (без вызова 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();
Обратите внимание, что этот последний пример вызовет две поездки в базу данных, но приведет к тому, что по сети будет отправлено меньше данных.