Arquivo

Archive for the ‘LINQ’ Category

LINQ to XML

Continuando a falar sobre LINQ, esse arquivo irá abordar LINQ to XML. Com o LINQ to XML poderemos realizar consultas e extrair dados de um arquivo XML, vamos montar um exemplo, primeiro criei um arquivo XML conforme exemplo abaixo:

<?xml version="1.0" encoding="utf-8"?>
<GrupoMusical xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Grupo>
    <Nome>Shakira Isabel Mebarak</Nome>
    <Genero>Pop Rock</Genero>
    <Pais>Colômbia</Pais>
  </Grupo>
  <Grupo>
    <Nome>U2</Nome>
    <Genero>Rock</Genero>
    <Pais>Irlanda</Pais>
  </Grupo>
  <Grupo>
    <Nome>Guns N' Roses</Nome>
    <Genero>Rock</Genero>
    <Pais>EUA</Pais>
  </Grupo>
</GrupoMusical>

Para realizar o LINQ no arquivo precisamos utilizar primeiro o namespace System.Xml.Linq que contém as classes para realizamos o LINQ to SQL.

Crie um projeto WPF com um botão e um grid, conforme imagem abaixo:

Não esqueça de adicionar ao seu projeto o arquivo XML que você gerou. Altere a propriedade do grid AutoGenerateColumns para true.

No evento Click do botão coloque o seguinte código

            XElement grupos = null;

            grupos = XElement.Load(@"Grupo.xml");

            var query = (from g in grupos.Elements("Grupo")
                         select new
                         {
                             Nome = g.Element("Nome").Value,
                             Genero = g.Element("Genero").Value,
                             Pais = g.Element("Pais").Value
                         });

            dataGrid1.ItemsSource = query.ToList();

As explicações: criamos um objeto do tipo XElement que recebe no seu construtor o caminho do arquivo XML. Esse objeto expõe o conteúdo do arquivo XML, podemos além de realizar LINQ, inserir, alterar e excluir elementos (não é o caso desse artigo).

Ao criar o LINQ fizemos grupos.Elements(“Grupo”), o Elements retorna uma coleção dos elementos filhos do elemento que informamos no exemplo informamos o elemento “Grupo”.

Dentro do Select utilizamos g.Element().Value, onde Element retorna o primeiro elemento com o valor. E por fim pegamos o resultado e exibimos no grid.

Veja o resultado abaixo.

Espero que tenham gostado e até a próxima.

Categorias:LINQ Tags:, ,

LINQ to DataSet

O LINQ é uma linguagem que utilizamos para realizar consultas em um fonte de dados. Existem LINQ to XML (para XML), LINQ TO SQL (para SQL Server) e também existe o LINQ to DataSet, que é o exemplo que pretendo explicar hoje.

O que seria LINQ to DataSet? Apenas uma consulta LINQ em um DataSet, verdade que existem algumas limitações, porém é uma possibilidade que poderá ser útil em algumas situações. Vamos criar um exemplo, vou usar um projeto do tipo WPF Application, vamos colocar na tela um Data Grid, um Button e um ComboBox, como a figura abaixo:

Criei o combo box com três opções: Todos, Diretor e Programador. A idéia é criar um DataSet com alguns colaboradores e realizar o filtro pelo cargo.

Crie um método chamado CarregarDataSet que retorne um DataSet conforme código abaixo:

        private DataSet CarregarDataSet()
        {
            DataSet ds = new DataSet();

            DataTable dt = new DataTable("COLABORADORES");

            dt.Columns.Add("NOME");
            dt.Columns.Add("CARGO");

            DataRow dr = dt.NewRow();

            dr["NOME"] = "Pedro";
            dr["CARGO"] = "Diretor";

            dt.Rows.Add(dr);

            dr = dt.NewRow();

            dr["NOME"] = "Marcos";
            dr["CARGO"] = "Programador";

            dt.Rows.Add(dr);

            ds.Tables.Add(dt);

            return ds;
        }

Estamos aqui criando um DataTable com duas colunas, populando esse DataTable com dois registro e por fim adicionamos o DataTable dentro do DataSet.

Agora vamos criar o evento do botão pesquisar (OnClick), veja o código abaixo:

            DataSet ds = CarregarDataSet();

            string strCargo = this.cmbProfissao.Text;

            var query = from p in ds.Tables["COLABORADORES"].AsEnumerable()
                        where p.Field("CARGO") == (strCargo != "Todos" ? strCargo : p.Field("CARGO"))
                        select p;

            this.dgColaboradores.ItemsSource = query.AsDataView();

Vamos as explicações.

1º Passo:

Criamos um DataSet e chamamos o métodos CarregarDataSet que irá devolver um DataSet populado conforme explicamos anteriormente.

2º Passo:

Criamos um variável o tipo anonymous e realizamos o LINQ to DataSet

Aqui primeiro passo foi definir qual a tabela do DataSet que vamos utilizar, no caso a de colaboradores (ds.Tables[“COLABORADORES”]).

Depois colocamos o AsEnumerable(), isso porque a classe DataTable não implementa a Interface IEnumerable e IQueryable e então o objeto DataTable não pode ser usado diretamente na consulta, temos que usar o AsEnumerable para que seja gerado um IEnumerable composto pelas linhas do DataTable.

3º Passo

No where utilizamos p.Field(“CARGO”), é necessário utilizar o Field para especificar os o tipo da coluna de DataTable que vamos gerenciar, no nosso exemplo a coluna chama CARGO e é do tipo string. Caso a coluna do DataTable aceite valor null, temos que trabalhar com p.Fiedl<string?>.

4º Passo

Para finalizar utilizamos query.AsDataView(), esse método proporciona uma visão padrão de tabela. Como utilizamos um tipo anonymous, foi necessário chamar esse método para que o datagrid interpretasse os registros.

Execute a aplicação e veja o resultado conforme imagem abaixo:

Obrigado e até a próxima.

Categorias:LINQ Tags:, ,

Oracle lança o provider para o Entity Framework 4

Finalmente a Oracle lançou a versão final para o provider do EF 4, deixando todos os desenvolvedores Oracle felizes. Acesse aqui para mais informações e download.

Fonte: Renato Haddad

Categorias:LINQ Tags:, ,

LINQ: IN no Entity Framework

Uma das muitas dúvidas sobre o Entity Framework é como fazer um IN. Muitos exemplos na Internet explicam que devemos utilizar o Contains e isso é verdade. O problema é que Contains não funciona quando fazemos LINQ com acesso a banco de dados no Entity Framework.

Veja um exemplo de LINQ to Entity utilizando o banco de dados AdventureWorks.

List<int> ids = new List<int>(){1, 2};

var varEmployee = from em in ef.Employee
               where ids.Contains(em.EmployeeID)
               select new
               {
                 ID = em.EmployeeID,
                 BirthDate = em.BirthDate
               };

GridView1.DataSource = varEmployee;
GridView1.DataBind();

Fazendo dessa forma teremos uma mensagem de erro:

LINQ to Entities não reconhece o método ‘Boolean Contains(Int32)’, que não pode ser convertido em uma expressão de armazenamento.

Isso acontece porque o Entity Framework ao converter o LINQ para T-SQL, não compreende o Contains.

Temos uma forma de resolver isso, fazendo como o exemplo abaixo:

List<int> ids = new List<int>(){1, 2};

var varEmployee = from em in ef.Employee.AsEnumerable()
               where ids.Contains(em.EmployeeID)
               select new
               {
                 ID = em.EmployeeID,
                 BirthDate = em.BirthDate
               };

GridView1.DataSource = varEmployee;
GridView1.DataBind();

Podemos substituir o AsEnumerable por ToList, teremos o mesmo resultado. Dessa forma o IN será realizado.

Cuidado: Quando você realiza o AsEnumerable ou ToList() ele tráz tudo do banco, perdendo a funcionalidade de filtrar antes do acesso. Mas em outras ocasiões como em uma lista muito grande que você utilizará no contains, você tem certas vantagens.

Gostaria de agradecer a Murilo Amaru Gomes que me ajudou a compreender essa funcionalidade do LINQ.

Obrigado pessoal e até a próxima.

Categorias:LINQ Tags:, ,

LINQ em CheckBoxList

Quanto trabalhamos com CheckBoxList normalmente precisamos pegar os valores que o usuário marcou. Antigamente fazia se um for ou um foreach para pegar esses valores, verificando através de um if se o valor foi marcado.

Utilizando LINQ (Language Integration Query) podemos realizar essa busca de uma forma muito mais rápida e simples.

O  LINQ é um recurso que foi integrado ao .Net 3.5 que permite a consulta rápida a Banco de dados, XML, coleção de objetos entre outros. Veja o exemplo abaixo.

var varTipoOperacao = (from t in this.cklTipoOperacao.Items.Cast<ListItem>()
                                                  where t.Selected
                                                  select t);

Nesse exemplo estou selecionando apenas os items que foram selecionados pelo usuário na aplicação.

Obrigado.

Categorias:LINQ Tags:,