तो मेरे पास एक एपीआई है और मेरे पास आहार की एक सूची है जिसमें उनके अंदर व्यंजनों की एक सूची है। यह कई से कई रिश्ते हैं, मैं एक विशिष्ट आहार से व्यंजनों की सूची प्राप्त करने की कोशिश कर रहा हूं, लेकिन मैं केवल व्यंजनों की सूची सहित आहार की पूरी सूची प्राप्त कर सकता हूं लेकिन मैं सिर्फ व्यंजनों की सूची प्राप्त करना चाहता हूं। यह वास्तविक कोड है।

    [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;
    }

मैंने पहले ही उपयोग करने की कोशिश की है कि केवल विशिष्ट आहार कहाँ प्राप्त करें, लेकिन यह मुझे एक खाली सूची देता है, इसलिए यह कोई विकल्प नहीं है। मैंने यहां किसी ऐसे व्यक्ति से एक समाधान भी देखा जिसकी एक ही समस्या थी (सूची वस्तु के साथ सूची वस्तु लौटाएं) लेकिन मैंने कोशिश की और यह एक त्रुटि देता है। यह वह कोड था जिसकी मैंने कोशिश की थी।

    [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;
    }

मुझे एक स्पष्ट रूपांतरण जोड़ना पड़ा क्योंकि दृश्य स्टूडियो ने मुझे ऐसा बताया, मैंने बिना किसी परिणाम के विधि के प्रकार को Task<IEnumerable<Recipe>> में बदलने की भी कोशिश की। यह जो त्रुटि देता है वह यह है।

System.InvalidCastException: 'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable1[<>f__AnonymousType01[System.Collections.Generic.List1[<>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, ValueTask1 actionResultValueTask) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker आवेदक , Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope&scope) पर टास्क लास्ट टास्क, स्टेट नेक्स्ट, स्कोप स्कोप, ऑब्जेक्ट स्टेट, बूलियन इज कम्पलीट) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- पिछले स्थान से स्टैक ट्रेस का अंत --- Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker) पर आह्वान Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) पर Microsoft.AspNetCore.Routing.EndpointMiddleware पर r, टास्क लास्ट टास्क, स्टेट नेक्स्ट, स्कोप स्कोप, ऑब्जेक्ट स्टेट, बूलियन इज कम्पलीट)। g__AwaitRequestTask|6_0(एंडपॉइंट एंडपॉइंट, टास्क रिक्वेस्ट टास्क, ILogger लकड़हारा) Microsoft पर।AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext प्रसंग) Swashbuckle पर। Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) पर Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext प्रसंग) HEADERS ======= स्वीकार करें: पाठ/सादा स्वीकार-एन्कोडिंग: gzip, deflate, br स्वीकार-भाषा: es- ES,es;q=0.9,en;q=0.8 कनेक्शन: कुकी बंद करें: वेबस्टॉर्म-1c66ffc5=ab57cd81-dd6b-4581-b4ce-e7c3216efe1b; वेबस्टॉर्म-1c670386=5cdc986c-d091-40b5-aafa-eba19ed04173 होस्ट: लोकलहोस्ट: 44394 रेफ़रर: https://localhost:44394/swagger/index.html उपयोगकर्ता-एजेंट: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit /537.36 (केएचटीएमएल, गेको की तरह) क्रोम/91.0.4472.114 सफारी/537.36 सेकेंड-च-यूए: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium"; v="91" sec-ch-ua-mobile: ?0 sec-fetch-site: समान-मूल sec-fetch-mode: cors sec-fetch-dest: खाली

उत्तर में ईएफ सम्मेलनों का पालन करने का भी उल्लेख है और मेरा कोड ऐसा ही था इसलिए मुझे केवल अंतिम भाग का पालन करना पड़ा लेकिन मुझे यह त्रुटि मिली और मुझे नहीं पता कि और क्या करना है। पूरी तरह से स्पष्ट होने के लिए मैं सिर्फ एक विशिष्ट आहार से व्यंजनों की सूची चाहता हूं, न कि व्यंजनों के साथ आहार सिर्फ व्यंजनों। आपकी सहायता के लिए धन्यवाद।

0
DarkMage 25 जून 2021, 05:20

3 जवाब

सबसे बढ़िया उत्तर

ठीक है तो कुछ कोशिशों के बाद मुझे समाधान मिल गया

    [HttpGet("[action]/{DietId}")]
    public async Task<IEnumerable<RecipeModel>> GetRecipesFromDiet([FromRoute] int DietId)
    {
        var diets = await _context.Diets
                                .Include(d => d.Recipes)
                                .FirstOrDefaultAsync(d => d.DietId == DietId);
        var recipes = diets.Recipes.ToList();
        return recipes.Select(c => new RecipeModel
        {
            RecipeId = c.RecipeId,
            NutritionistId = c.NutritionistId,
            Name = c.Name,
            Ingredients = c.Ingredients,
            Description = c.Description,
            Preparation = c.Preparation
        });
    }

मुझे व्यंजनों को "प्रिंट" करने के लिए एक मॉडल का उपयोग करना था और एक लूप नहीं बनाना था (बस सूची को वापस करने से "ऑब्जेक्ट प्रकार डालने में असमर्थ" हो जाएगा, इसे ध्यान में रखें)। साथ ही, पहली कोशिश में इसे कोई आहार नहीं मिला क्योंकि मैं "[क्रिया]/{DietId}" मार्ग में आईडी जोड़ना भूल गया था। आपकी मदद के लिए धन्यवाद, मुझे आशा है कि अगर किसी और को इस समस्या का सामना करना पड़ता है तो यह उनकी मदद कर सकता है।

0
DarkMage 25 जून 2021, 06:47

अपनी जॉइनिंग टेबल में से चयन करना आसान हो सकता है (जाहिर है कि मुझे नहीं पता कि आपने इसे क्या कहा है, इसलिए डायट_टू_रेसिपी को आवश्यकतानुसार बदलें):

[HttpGet("[action]")]
public async Task<IEnumerable<Recipe>> GetRecipesFromDiet([FromRoute] int DietId)
{
    return _context.Diets_To_Recipes.Where(x => x.DietId == DietId)
           .Select(x => x.Recipe);
}
1
IllusiveBrian 25 जून 2021, 03:30

ToListAsync का उपयोग करके Diet को EF क्वेरी से बाहर निकालें। फिर उनमें से Recipes को पकड़ें।

var diets = await _context.Diets
                          .Include(d => d.Recipes)
                          .Where(d => d.DietId == DietId)
                          .ToListAsync();
    
return diets.Select(x => x.Recipes).ToList();
1
Jonesopolis 25 जून 2021, 02:28