Wpis z mikrobloga

Uczę się C#/.net a przechodzę z JS/TS i napisałem swojego pierwszego cruda z tutorialem z YouTube. Szukałem po googlach co robi "using" pod spodem ale nie znalazłem nic co by mi odpowiedziało na moje pytanie. A zastanawiam się czemu w poniższym kodzie, jeżeli odkomentuję "using Microsoft.EntityFrameworkCore;" mam możliwość użycia "ToListAsync()" w "context.Drivers" a bez tego nie mam takiej możliwości.
Kod:

using AppApi.Data;
using AppApi.Models;
using Microsoft.AspNetCore.Mvc;
// using Microsoft.EntityFrameworkCore;

namespace AppApi.Controllers;

[ApiController]
[Route("[controller]")]
public class DriversController : ControllerBase
{
private readonly ApiDbContext _context;

public DriversController(ApiDbContext context)
{
_context = context;
}

[HttpGet]
public IActionResult GetDrivers()
{
List<Driver> drivers = _context.Drivers.ToList(); // ToListAsync()
return Ok(drivers);
}
}

ApiDbContext wygląda tak:

using Microsoft.EntityFrameworkCore;
using AppApi.Models;

namespace AppApi.Data
{
public class ApiDbContext : DbContext
{
public DbSet<Driver> Drivers { get; set; };
public ApiDbContext(DbContextOptions<ApiDbContext> options) : base(options)
{

}

}
}

Skoro ApiDbContext używa Microsoft.EntityFrameworkCore to wydaje mi się że ta metoda "ToListAsync" powinna już tam być a jej nie ma. A ApiDbContext przychodzi z zewnątrz do DriversController to jakim sposobem cokolwiek w DriversController zmienia ApiDbContext? Może mi to ktoś wyjaśnić albo dać linka do jakiegoś źródła które wytłumaczy jak dla n00ba co się dzieje pod spodem? Bo wszystkie tutoriale mówią jak zrobić fora albo ifa a z tym to sobie poradzę. I beka bo ChatGPT napisał :

Odkomentowanie linii using Microsoft.EntityFrameworkCore; nie powinno dodać metody ToListAsync() do _context.Drivers. Metoda ToListAsync() jest dostępna na obiektach typu IQueryable<T>, które są zwracane przez kontekst bazy danych (w tym przypadku ApiDbContext).


Więc chyba się zgadza XD

Pytanie zapewne w stylu n00b 2000, ale cóż zrobić. :D Z góry dzięki.
#naukaprogramowania #csharp #dotnet
  • 13
@wobloblo: ToListAsync to jest extension method zdefiniowany w Microsoft.EntityFrameworkCore;
Dokładnie tutaj: https://github.com/dotnet/efcore/blob/main/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs
To, że w klasie ApiDbContext masz już using na ten namespace to nie ma żadnego znaczenia.

Tak naprawdę ta linia mogłaby być napisana w ten sposób (i tak to naprawdę działa):
Microsoft.EntityFrameworkCore.QueryableExtensions.ToListAsync(_context.Drivers);
@programista15cm: no jeżeli odwołujesz się do jakieś przestrzeni nazw której u siebie nie masz to sam musisz sobie je zainstalować(nuget)/dodać refrencje(jakieś assembly np własne). Namesapce jest podobne do Packages w Javie, a assembly to jar
  • 0
@programista15cm @zenoniusz @budyn @Dick_Mahoney @Mazowia dziękuję wszystkim za odpowiedzi.

@programista15cm To że dodając "Using coś tam" używam "coś tam" to wiem. Jak @budyn i @zenoniusz napisał "ToListAsync" to extension method. W JS czy TS się z czymś takim nie spotkałem. Nie wiem nawet czy coś takiego w JS/TS istnieje, wiem że można zmodyfikować prototyp jakiegoś obiektu żeby dodać do niego metodę ale nie spotykałem się z samododającymi się metodami :D

Link od
  • 0
@Dick_Mahoney: Tak staram się robić ale to mój pierwszy crud i mimo że klepię różne rzeczy w TS to składnia C# jest trochę inna i pewnie by mi chwilę zajęło zanim bym to wyłapał a google nie wyrzuciło mi nic na temat extension methods po krótkim szukaniu. Teraz czuję że zaraz będę senior .net developer :D Więc będzie tylko lepiej :)