Mam taki kod:
var users = await dbContext.Users
.Where(u => u.NormalizedUserName.StartsWith(query.UserName.ToUpper()))
.Take(query.Limit)
.ProjectTo<UserShortInfoDto>(mapper.ConfigurationProvider)
.ToListAsync(cancellationToken);
W debugerze widać, że zostało wygenerowane takie zapytanie:
SELECT TOP(@__p_1) [u].[HasAvatar], [u].[Id], [u].[UserName]
FROM [AspNetUsers] AS [u]
WHERE ([u].[NormalizedUserName] LIKE @__ToUpper_0 + N'%' AND (LEFT([u].[NormalizedUserName], LEN(@__ToUpper_0)) = @__ToUpper_0)) OR (@__ToUpper_0 = N'')
Pytania:
- Dlaczego pojawia się jednocześnie
LIKE
iLEFT
? SamoLIKE
by nie wystarczyło? - Dlaczego po podstawieniu jakichś danych dostaję index seek zamiast index scan, skoro w SQLu pojawia się funkcja
LEFT
i operatorAND
, który gwarantuje wykonanie się tej funkcji? Jeśli wyrzucęLIKE
, to dostanę index scan (index jest naNormalizedUserName
).