Sto utilizzando EntityFramework per selezionare i dati dal mio database mssql. La mia domanda simile a questa:EntityFramework 6.1.1 con problema Linq Performance
int param = 123456;
using (var context = new DatabaseContext())
{
var query = context.Table.AsQueryable();
var result = query.Where(o => o.Id == param).ToList();
}
Questa query richiede circa 10 secondi.
using (var context = new DatabaseContext())
{
var query = context.Table.AsQueryable();
var result = query.Where(o => o.Id == 123456).ToList();
}
Questa query richiede meno di 1 secondo.
Ho appena scoperto che EntityFramework genera due query diverse.
Domanda 1:
SELECT TOP (20)
[Project1].[Id] AS [Id],
[Project1].[Name] AS [Name],
FROM (SELECT [Project1].[Id] AS [Id], [Project1].[Name] AS [Name], row_number() OVER (ORDER BY [Project1].[Id] DESC) AS [row_number]
FROM (SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name]
FROM [dbo].[Table] AS [Extent1]
WHERE [Extent1].[Id] = @p__linq__0
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 0
ORDER BY [Project1].[Id] DESC
-- p__linq__0: '2932323' (Type = Int32, IsNullable = false)
Domanda 2:
SELECT TOP (20)
[Filter1].[Id] AS [Id],
[Filter1].[Name] AS [Name]
FROM (SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], row_number() OVER (ORDER BY [Extent1].[Id] DESC) AS [row_number]
FROM [dbo].[Table] AS [Extent1]
WHERE 2932323 = [Extent1].[Id]
) AS [Filter1]
WHERE [Filter1].[row_number] > 0
ORDER BY [Filter1].[Id] DESC
Esiste un modo per accelerare il prima uno o un altro modo per farlo?
Puoi mostrare le query che vengono generate per ognuna? Inoltre, perché non stai interrogando direttamente il 'context'? Perché usare 'AsQueryable()'? –
'AsQueryable()' è ridondante in entrambi i casi – haim770
@ haim770 Ridondante, sì, ma non problematico o dannoso. – Servy