Adadev

Dicas de Otimização de Operações no Banco de Dados C#

28 de Novembro de 2017

Neste artigo vou dar algumas dicas de como escrever consultas e fazer alterações na base de dados em C# de forma mais eficiente.

Consulta com "where" grande

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();
}

Atualizar um registro da base de dados

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();

Veja mais em:

Sintaxe de consulta e sintaxe de método em LINQ (C#)

Atualização de um campo

[voltar ao início]