首页 > 解决方案 > 如何从具有列表的元素列表中返回列表

问题描述

所以我有一个 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__AnonymousType01 [System.Collections.Generic.List 1[<>f__AnonymousType15 [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, ValueTaskg__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 约定,我的代码就是这样,所以我只需要遵循最后一部分,但我得到了这个错误,我不知道还能做什么。为了完全清楚,我只想要特定饮食的食谱列表,而不是带有食谱的饮食只是食谱。谢谢你的帮助。

标签: c#.netasp.net-coreentity-framework-core

解决方案


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();

推荐阅读