By Cicero

C# Linq to SQL, aumentando o desempenho

Dica #1: Bagagem Extra

A “Bagagem extra” de um contexto que se utiliza do Linq to SQL é um problema clássico desta metodologia hoje considerada a principal entre os desenvolvedores .NET, prova é, que vem sendo otimizada para cada atualização dos pacotes de Framework desde a versão 3.5.

Quando criamos um contexto para utilizar o Linq ele vem com uma serie de propriedades pré-configuradas para estarem ativas (True), uma delas especificamente tem papel fundamental no desempenho de uma consulta, a ObjectTrackingEnabled(Framework 3.5).

Em programação orientada a objetos as tabelas do banco de dados são representados através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes, quando abrimos um contexto e a propriedade em questão esta em seu estado normal (true), faz com que o mesmo ocupe memória para guardar os valores de cada instância envolvida na consulta para caso houver alteração ele valide as alterações realizadas. Muitas vezes utilizamos um contexto para obtermos retornos com apenas o propósito de ser “ready only”, por tanto, não se faz necessário o uso de memória para monitorarmos os valores instanciados.

nerd

Para orientarmos o Framework a não guardar o valor das instâncias em nosso contexto setamos ele como false. Veja o exemplo abaixo onde demonstramos em uma simples consulta.

public static List<SourceTipe> VerificaAniversarios() {

using ( var ctxs = new PetShopDataContext(PetShopLib.CUtil.Conection))
{
          ctxs.ObjectTrackingEnabled = false;

           //Seu código
}

}

Lembrando que existem vários meios de se setar as propriedades de um contexto e o fazê-lo dentro de um método é somente mais uma delas.

Dica #2: Use as projeções para emagrecer suas consultas

Vamos falar sobre duas maneiras de enxugar nossas consultas usando o Linq. Digamos que você tenha uma tabela Aluno que contém 50 campos, mas você esta interessado em três: Nome, Sobrenome, RG. Neste caso temos que ter cuidado ao executar nossa consulta e selecionar somente os campos que precisamos como por exemplo:

var aluno =

( from a in dataContext.Aluno

where a.ID == AlunoID

select  new {

Aluno.Nome,

Aluno.Sobrenome,

Aluno.RG

}).Single();

Outra maneira muito utilizada é filtrando os dados que queremos selecionar na fonte da busca o banco de dados. Para isso usamos muito views para filtrar apenas os dados que queremos e assim usando a mesma como fonte em nosso método Linq, veja o exemplo abaixo:

public List<T> NomeMétodo()

{

var SQL = (from ser in ctx.view

//Resto do código

O que precisamos cuidar é que desenvolvedores pensam sempre em como economizar esforços e já antecipam futuras funcionalidades carregando suas views com “todos os campos que um dia vou precisar”, outra prática comum que pode ser perigosa é usar uma mesma view para mais de uma consulta. Precisamos entender que nem sempre poupar trabalho é o melhor caminho para termos um software com um bom desempenho.

Dica #3: Use LinqPAD para ter certeza do que esta fazendo

Como todos sabemos uma das maiores facilidades do Linq pode ser também uma de suas fraquezas, a facilidade de executar consultas as vezes nos cega referente ao que transportamos de informação realmente útil em nosso contexto, em um dia de trabalho quantas vezes você para para revisar além do resultado de seu método? Quanto tempo você perde  iniciando sua aplicação com Breakpoints para avaliar cada processo de um único método?

O LinqPAD pode ser uma ferramente muito útil para você criar qualquer tipo de consulta e avaliar exatamente o que você está transportando de informações pois você tem uma rica formatação de saída:

LinqPAD

Então escreva seus métodos certifique-se do seu desempenho e ainda tenha uma ótima  experiência de aprendizado.

Conclusão:

Não abordamos assuntos profundos de otimização, porém pautamos uma estrada de fácil alcance a todos independente do nível de conhecimento. O desenvolvimento de software é uma área onde alimentamos muitos vícios bons e ruins, mas nunca é demais olhar para o lado do cliente que não vai entender o porque demora tanto para efetuar uma busca hehehe.

MVC Razor C# Sintaxe

A Devsol Softwares como já é de conhecimento de todos os colaboradores, está dando segmento a um de seus projetos mais ousados, não entrando no mérito inovação mas sim tecnicamente falando. Com esse Post busco introduzir alguns conceitos básicos sobre o MVC Razor para que torne mais fácil o entendimento de futuros Post’s que abordem o projeto Publiquesine de forma mais profunda.

Principais Regras

  • Blocos de código Razor são declarados @{…}
  • Funções e variáveis começam com @
  • Linhas de código terminam com ponto e vírgula
  • String são colocados entre aspas como no padrão .NET
  • Toda parte de C# é case sensitive, ou seja, deve se respeitar a sintaxe bem como suas letras maiúsculas e minusculas
  • Os arquivos em c# possuem a extensão .cshtml

C# Exemplo

  1. <!—Declaração simples de uma variável–>
    @{ var minhaMensagem = “Olá pessoal”; }
  2. <!—Expressão regular de uma variável–>
  3. <p>The value of myMessage is: @minhaMensagem </p>
  4. <!– Bloco de concatenação de variáveis –>
    @{
    var saudacao = “Welcome to our site!”;
    var diaSemana = DateTime.Now.DayOfWeek;
    var saudacaoMsg = saudacao + ” Estou em Porto Alegre, e hoje é dia: ” + diaSemana ;
    }
  5. <p>The greeting is: @saudacaoMsg </p>

Como funciona

O razor é uma syntaxe de programação que pode ser incorporada no código das páginas que o servidor WEB recebe (HTML). É baseado no arquitetura dos frameworks ASP.NET, mas usa uma syntaxe simplificada que é mais fácil de apreder.

Quando um servidor WEB interpreta uma página em HTML que contém códigos Razor este é executado em primeiro lugar antes de enviar a página HTML para o navegador. O código que é executado no servidor pode executar tarefas que não podem ser feitas no navegador, por exemplo acesso a um banco de dados do servidor.

Trabalhando com Objetos

O objeto “Data” é um tipo de objeto imbutido no ASP.NET, mas objetos também podem ser auto-definidos, uma página web, uma caixa de texto, um arquivo, um registro de banco de dados etc.
Os objetos podem ter métodos que desempenham um registro de banco de dados através de um método “Save”, um objeto de imagem pode ter um método “Girar”, um objeto de e-mail pode ter um “Enviar” e assim por diante.

Existe também propriedades que descrevem suas características. Um registro de banco de dados pode ter um FirstName e uma respectiva propriedades Apelido.

O exemplo abaixo mostra como acessar algumas propriedades do Objeto Date:

  1. Day: @DateTime.Now.Day
  2. Hour: @DateTime.Now.Hour
  3. Minute: @DateTime.Now.Minute
  4. Second: @DateTime.Now.Second

Condições

@var txt = “”;
if(DateTime.Now.Hour > 12)
{
txt = “Boa tarde”;
}
else
{
txt = “Bom dia”;}
}
<html>
<body>
<p>A mensagem é: @txt </p>
</body>
</html>

Exemplo de outras complexidades

<div class=”sidebar”>
         @foreach (var item in @Model.ListaEsfera()
          if (item.Nome.ToLower().Equals(@Model.f_esfera))
         {
                  @Html.RadioButtonFor(m => m.f_esfera, item.Nome, new { @checked = “checked”,                                                        onchange = “this.form.submit();”, style = “margin-right:5px” })
          }
         else{
                  @Html.RadioButtonFor(m => m.f_esfera, item.Nome, new { onchange =                                                                               “this.form.submit();”, style = “margin-right:5px” })
         }

         @Html.Label(@item.Nome)
}
</div>

Como funciona

Como mencionamos acima o Razor é uma syntaxe de programação incorporada ao HTML, portanto no exemplo acima criamos uma forma dinâmica de adicionar elementos HTML, no caso RadioButtons (Note que tudo esta encapsulado dentro de uma <div> (elemento comum do html).
No exemplo acima, para cada elemento existente no parâmetro do foreach ele incorpora RadioButtons  (http://www.c-sharpcorner.com/uploadfile/mahesh/radio-button-in-C-Sharp/) com seu atributo nome e dependendo da validação poderá vir selecionado “@checked = “checked”. Abordaremos com mais detalhes este tipo de operação em futuros Post da categoria de desenvolvimento.

Conclusão

Espero que este poste ajude, esclareça, desperte curiosidade sobre esta tecnologia que é nova para todos nós. Deixo abaixo links que podem ajudar a introduzir melhor o assunto na mente de todos que querem aprender.

Um forte abraço e bons estudos.

http://www.microsoftvirtualacademy.com/training-courses/introduction-to-asp-net-mvc

http://www.w3schools.com/aspnet/webpages_razor.asp

http://weblogs.asp.net/scottgu/introducing-razor