Neste artigo vou dar algumas dicas de como escrever consultas e fazer alterações na base de dados em C# de forma mais eficiente.
Quando fazemos uma consulta com muitas condições no where a consulta pode ficar mais lenta de acordo com a forma como se escreve o código em C#. Por exemplo, para buscar os restaurantes dentro de uma área limitada por um retângulo, passamos como parâmetro a coordenada superior a oeste e a coordenada inferior a leste e buscamos os restaurantes. Uma busca usando o LINQ com sintaxe de consulta fica assim:
public static List<Place> GetRestaurantsInRectangleBounds(DbContext context, double northwestLon, double northwestLat, double southeastLon, double southeastLat) { return (from place in context.Place where place.type == "restaurant" && place.location.x >= northwestLon && place.location.y <= northwestLat && place.location.x <= southeastLon && place.location.y >= southeastLat select place).ToList(); }
Podemos fazer a mesma pesquisa usando o LINQ com sintaxe de método e expressões lambda. A consulta fica mais performática quando usada com maior quantidade de dados:
public static List<Place> GetRestaurantsInRectangleBounds(DbContext context, double northwestLon, double northwestLat, double southeastLon, double southeastLat) { return context.Place.Where(place => place.type == "restaurant" && place.location.x >= northwestLon && place.location.y <= northwestLat && place.location.x <= southeastLon && place.location.y >= southeastLat).ToList(); }
A forma de atualizar um registro na base de dados interfere no tempo para fazê-lo. Uma maneira de fazer o update é mudando o estado da entidade, como mostrado no código abaixo:
public static List<Place> UpdateRestaurant(DbContext context, Place place) { place.type = "restaurant"; context.Entry(place).State = EntityState.Modified; context.SaveChanges(); }
Existem duas formas mais eficientes de fazer esse update. Uma delas é usar o mesmo contexto para buscar as entidades e salvar as modificações. Desta forma, não há necessidade de usar comandos explícitos para fazer o update, apenas modificar o objeto. Como é mostrado no código abaixo:
List<Place> myPlaces = context.Place.ToList(); foreach(Place p in myPlaces) { p.type = "restaurant"; } context.SaveChanges();
Outra opção é atualizar apenas a(s) propriedade(s) alterada(s):
List<Place> myPlaces; using(DbContext context = new AdaLovelaceContext()){ myPlaces = context.Place.ToList(); } foreach(Place p in myPlaces) { p.type = "restaurant"; context.Place.Attach(p); context.Entry(p).Property("type").IsModified = true; } context.SaveChanges();