Ho la seguente query linq
internal List<ZipCodeInfo> GetInfoFromZipCode(string zipCode)
{
using (DbContext context = new DbContext())
{
IQueryable<ZipCodeInfo> results;
results = (from a in context.Address
where a.ZipCode.Equals(zipCode)
select new ZipCodeInfo
{
Field1 = a.Field1,
Field2 = a.Field2,
Field3 = a.Field3
});
return results.ToList();
}
}
Ma la query richiede circa 5-6 secondi per essere completata. Ho eseguito la query di contropartita su SQL e non ci vuole quasi nulla per completare. Perché ci vuole così tanto? La query alla fine restituisce solo 4 corrispondenze quindi non c'è molto da fare qui ..
Questa query fa parte di una classe Controller e sto utilizzando ASP.NET Core e EntityFramework Core.
La query SQL ha questo aspetto, btw.
SELECT *
FROM Address
WHERE ZipCode = '29130'
Puoi riscrivere sopra la query come mostrato di seguito. Per favore facci sapere le prestazioni ora.
internal List<ZipCodeInfo> GetInfoFromZipCode(string zipCode)
{
using (DbContext context = new DbContext())
{
//disabled tracking
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
IQueryable<ZipCodeInfo> results;
results = (from a in context.Address
where a.ZipCode.Equals(zipCode)
select new ZipCodeInfo
{
Field1 = a.Field1,
Field2 = a.Field2,
Field3 = a.Field3
});
return results.ToList();
}
}
Non so quale versione di .Net e framework di entità stai usando, ma ho trovato un articolo interessante qui su MSDN . Puoi attraversarlo. Ma il codice può essere utilizzato come di seguito:
static readonly Func<DbEntities, IQueryable<ZipCodeInfo>> s_compiledQuery2 =
CompiledQuery.Compile<DbEntities, IQueryable<ZipCodeInfo>>(
(ctx, total) => from a in context.Address
where a != null and a != ""
a.ZipCode.ToUpper().Equals(zipCode.ToUpper())
select new ZipCodeInfo
{
Field1 = a.Field1,
Field2 = a.Field2,
Field3 = a.Field3
});
internal List<ZipCodeInfo> GetInfoFromZipCode(string zipCode)
{
using (DbEntities context = new DbEntities())
{
IQueryable<ZipCodeInfo> zipCodes = s_compiledQuery2.Invoke(context, zipCode);
return zipCodes.ToList();
}
}
A questo punto non ho alcun database remoto da testare, ma di nuovo il ritardo nel recuperare il risultato di questo tipo di query dipenderà anche da N \ W e dal numero di record recuperati. Puoi provare questa soluzione.