EF jest generowanie różnych SQL dla dwóch podobnych oświadczeń wymienionych poniżejEF SQL zmienione podczas przechodzenia predykatu jako parametr, gdzie klauzula
var test = dbcontext.Persons.GetAll()
.Where(c => c.PersonID == 2)
.Select(c => c.PersonName)
.FirstOrDefault();`
Generated SQL:
SELECT
[Limit1].[PersonName ] AS [PersonName ]
FROM
(SELECT TOP (1)
[Extent1].[PersonName ] AS [PersonName ]
FROM
[dbo].[ApplicationRequest] AS [Extent1]
WHERE
[Extent1].[PersonID ] = @p__linq__0) AS [Limit1]',N'@p__linq__0 uniqueidentifier',@p__linq__0= "2"
używam powyższe oświadczenia w wielu miejscach o innym stanie niż Where
; skonsolidować logiki w jednym miejscu ja przechodząc stan jako parametr
Public Void PassPredicate(Func<ApplicationRequest, bool> ReqFunc)
{
var test = dbcontext.Persons.GetAll()
.Where(ReqFunc)
.Select(c => c.PersonName)
.FirstOrDefault();
}
Wołam funkcję jako
PassPredicate(c => c.PersonID == 2);
Generated SQL:
SELECT
[Extent1].[PersonID] AS [PersonID],
[Extent1].[PersonName ] AS [PersonName ],
[Extent1].[DOB] AS [Dob],
[Extent1].[Height] AS [Height],
[Extent1].[BirthCity] AS [BirthCity],
[Extent1].[Country] AS [Country],
FROM
[dbo].[Person] AS [Extent1]
Jeśli spojrzeć na sekundę SQL, to dość alarmujące: pobiera wszystkie informacje (kolumny i wiersze). Nie ma tam klauzuli where i wyboru wszystkich kolumn.
Warunek miejsca jest stosowany po zwróceniu wyników z DB.
Jedyną różnicą w drugiej instrukcji jest to, że przekazuję warunek jako parametr zamiast warunku wewnątrz klauzuli where.
Czy ktoś może wyjaśnić, dlaczego różnica?
'var test = dbcontext.Persons.GetAll(). Gdzie (c => c.PersonID == 2). Wybierz (c => c.PersonName) .FirstOrDefault();' dlaczego nie używasz prostego wyrażenia jak 'var test = dbcontext.Persons.FirstOrDefault (c => c.PersonID == 2). Wybierz (c => c.PersonName);' –
Jestem trochę związany z wykorzystaniem innych niż GetALL.Aktualnie nie używamy Dokładna składnia .. Używamy czegoś w rodzaju PersonsRepository.GetAll() ... Repozytorium ujawnia tylko ograniczone funkcjonalności –
oky, ale myślę, że używa dodatkowych zasobów. –