c# - 如何从具有列表的元素列表中返回列表
问题描述
所以我有一个 API,我有一个饮食列表,里面有一个食谱列表。这是多对多的关系,我一直试图从特定饮食中获取食谱列表,但我只能获取整个饮食列表,包括他们的食谱列表,但我只想获取食谱列表。这是实际的代码。
[HttpGet("[action]")]
public async Task<IEnumerable<Diet>> GetRecipesFromDiet([FromRoute] int DietId)
{
var diet = _context.Diets.AsQueryable();
diet = diet.Include(d => d.Recipes).AsNoTracking();
List<Diet> _return = await diet.ToListAsync();
return _return;
}
我已经尝试使用 where 只获取特定的饮食,但它返回给我一个空列表,所以它不是一个选项。我什至从遇到相同问题的人那里看到了一个解决方案(Return list object with list object),但我试过了,但它给出了一个错误。这是我尝试过的代码。
[HttpGet("[action]")]
public async Task<IEnumerable<Diet>> GetRecipesFromDiet([FromRoute] int DietId)
{
var result = _context.Diets.Where(d => d.DietId == DietId).Select(d => new
{
Recipes = d.Recipes.Select(recipe => new
{
RecipeId = recipe.RecipeId,
Name = recipe.Name,
Description = recipe.Description,
Preparation = recipe.Preparation,
Ingredientes = recipe.Ingredients
}).ToList(),
});
return (IEnumerable<Diet>)result;
}
我必须添加一个显式转换,因为 Visual Studio 告诉我,我也尝试将方法的类型更改为Task<IEnumerable<Recipe>>
没有结果。它给出的错误就是这个。
System.InvalidCastException:无法投射类型为“Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1[<>f__AnonymousType0
1 [System.Collections.Generic.List1[<>f__AnonymousType1
5 [System.Int32,System.String,System.String,System.String,System.String ]的对象]]]]' 键入'System.Collections.Generic.IEnumerable1[NutricareApp.Entities.Diet]'. at NutricareApp.Web.Controllers.DietsController.GetRecipesFromDiet(Int32 DietId) in D:\Projects\C#\Server-Side-Software\NutricareApp.Web\Controllers\DietsController.cs:line 77 at lambda_method6(Closure , Object ) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask
g__Awaited|17_0(ResourceInvoker 调用程序,任务任务,IDisposable 范围)在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(端点端点,任务 requestTask,ILogger 记录器)在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文) Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context) HEADERS ===== == Accept: text/plain Accept-Encoding: gzip, deflate, br Accept-Language: es-ES,es;q=0.9,en;q=0.8 Connection: close Cookie: Webstorm-1c66ffc5=ab57cd81-dd6b-4581- b4ce-e7c3216efe1b;Webstorm-1c670386=5cdc986c-d091-40b5-aafa-eba19ed04173 主机:本地主机:
答案还提到要遵循 EF 约定,我的代码就是这样,所以我只需要遵循最后一部分,但我得到了这个错误,我不知道还能做什么。为了完全清楚,我只想要特定饮食的食谱列表,而不是带有食谱的饮食只是食谱。谢谢你的帮助。
解决方案
Diet
使用 将s 从 EF 查询中拉出ToListAsync
。然后抓住Recipes
他们。
var diets = await _context.Diets
.Include(d => d.Recipes)
.Where(d => d.DietId == DietId)
.ToListAsync();
return diets.Select(x => x.Recipes).ToList();
推荐阅读
- c# - 如何根据其值向 html 表添加颜色?
- python - 使用 Pandas Python 过滤数据框
- c# - 角循环没有正确迭代
- java - 放心 - 如何在重定向中包含 cookie?
- python - 当列文本包含超过 10 个单词时过滤 pyspark DataFrame
- c - 警告:函数“gets”的隐式声明;您指的是 'fgets' 吗?[-Wimplicit-function-declaration]
- lua - 如何让玩家在 Lua 中以流畅和标准的方式跳跃?
- prolog - Prolog Quicksort 使用第二个元素作为枢轴
- mysql - MySQL 选择最近 N 天最活跃的用户
- c# - 在 Unity 中的网格位置添加 GameObject