Explicação sobre Expression com EF

56 views
Skip to first unread message

Thiago Aguiar

unread,
Mar 30, 2013, 11:36:59 PM3/30/13
to dotnetar...@googlegroups.com
To tentando entender um comportamento estranho aqui,

Fiz uma comandos para fazer filtro e "Include" para não expor meu Contexto, ate a tudo bem, filtro sendo feito no banco tudo otimo.

Hoje eu foi fazer um MAX, pq com não tenho acesso ao IQueryable, foi liberar um Max, sem problema fiz isso.

Query<Tiu_TipoUtilizacao>(null).Max((u => u.Tiu_Codigo))

OBS. O null do parametro da Query eh ára fazer algum filtro.

Funcionou perfeito. Max sendo feito no banco.


mas fazendo isso:

Func<Tiu_TipoUtilizacao, int?> expression = (u => u.Tiu_Codigo);
Query<Tiu_TipoUtilizacao>(null).Max(expression);

O Max ta sendo feito no Linq.

OBS. não existe Enumerable, ToList etc.... apenas coloquei a expression em uma variável e o Max foi feito no Linq, e não mas no BD.









life runs on code

Thiago Aguiar

Priscila Mayumi Sato

unread,
Mar 30, 2013, 11:54:40 PM3/30/13
to Grupo DotNetArchitects
Olá, eu acho que essa dúvida não tem nada a ver com arquitetura.

Mas, vamos lá, eu não tenho certeza se entendi sua dúvida. VOcê quer saber se é normal os comandos serem executados no banco? Isso ocorre para não trazer muitos dados para a aplicação.

Seja linq to entities ou lambda os comandos são desmembrados e transformados em sql.

Ah... qual sua dúvida?


--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo ".Net Architects" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para dotnetarchitec...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
Priscila Mayumi Sato
Twitter: @MayogaX

Ricardson Albuquerque

unread,
Mar 30, 2013, 11:56:20 PM3/30/13
to dotnetar...@googlegroups.com
Hahaha, esperei alguém responder algo para não ser o chato.

Não sei se foi devido o massacre ao português, mas eu também não consegui entender nada com nada.


2013/3/31 Priscila Mayumi Sato <mayum...@gmail.com>



--
Ricardson Albuquerque

Juan Lopes

unread,
Mar 31, 2013, 12:12:06 AM3/31/13
to dotnetar...@googlegroups.com

Use Expression<Func<...

--

Priscila Mayumi Sato

unread,
Mar 31, 2013, 12:59:26 AM3/31/13
to Grupo DotNetArchitects
como o Juan entende o que o cara quer?
Acho que me falta aumentar minhas capacidades de interpretação

Rodrigo Vidal

unread,
Mar 31, 2013, 1:01:10 AM3/31/13
to dotnetar...@googlegroups.com
Como o Juan já respondeu, vc precisa usar Expression<Func<>> para essa expressão ser transformada em uma query sql.

Abraço,

  Rodrigo Vidal

Priscila Mayumi Sato

unread,
Mar 31, 2013, 1:03:32 AM3/31/13
to Grupo DotNetArchitects
tudo vai ser transformado em query no final, se era essa a dúvida '-'

Thiago Aguiar

unread,
Mar 31, 2013, 11:21:09 AM3/31/13
to dotnetar...@googlegroups.com
não.... a diferença entre o primeiro e o segundo código eh apenas a variável com Expression, só isso.


Eu to falando do que foi feito no banco, o primeiro código Fez um MAX no banco. 

Select MAX(........


O segundo fez o Max no C#(Linq), ou seja, faz o "Select * from tabela" e no Linq ele pegou o Max.
   O resultado eh o mesmo, não teve mudança. So a forma de fazer isso. 

Como essa mudança no código gerou a mudança de comportamento?














life runs on code

Thiago Aguiar


2013/3/31 Priscila Mayumi Sato <mayum...@gmail.com>
tudo vai ser transformado em query no final, se era essa a dúvida '-'

Marcus Alexandre Silva

unread,
Mar 31, 2013, 11:30:37 AM3/31/13
to dotnetar...@googlegroups.com
Tentando ser simplista para melhor entendimento:

A Func<> é a passagem da Função ou método propriamente dita. Quando o cara que você passou vai consumir ele chama o que esta dentro dela propriamente dita.

A Expression<Func<>> é +- o metadado da função, que descreve o que tem dentro dela, seus operadores e operandos. O Entity usa isto (o metadado) para converter para Sql, (fazendo um parse da Func<> para Sql). Você mesmo, brincando, pode construir seu próprio Parse de qualquer coisa com Expression<>, vale o lazer.


Marcus Alexandre


Alexsandro

unread,
Mar 31, 2013, 9:59:28 PM3/31/13
to dotnetar...@googlegroups.com
Este assunto "Expression<Func<>>" realmente é interessante demais... vale o lazer²

Victor Arias

unread,
Mar 31, 2013, 11:05:20 PM3/31/13
to dotnetar...@googlegroups.com
Apesar do que estão falando, você se fez claro. Obviamente pode melhorar (removendo por exemplo a parte do include, contexto e blabla que nao sao necessarios), mas acho que pra ter certeza que alguem que conhece como as queries são geradas vc precisaria no maximo falar "Linq to Objects" ao inves de apenas Linq. No entanto o problema eh nitido, vide as respostas do Juan e do Vidal :-)

PS: O grupo fica muito melhor com perguntas como essa (que nao sao de arquitetura mas entregam algum valor) do que as ultimas grandes threads do grupo. Não da para deixarem o cara em paz não?

[]s,
Victor Arias

Thiago Aguiar

unread,
Apr 1, 2013, 8:20:46 AM4/1/13
to dotnetar...@googlegroups.com
Victor, valew pela resposta, porem a resposta de Juan não responde a pergunta. Ele só manda usar algo que eu já tava usando.






life runs on code

Thiago Aguiar


2013/4/1 Victor Arias <aria...@gmail.com>
--

Juan Lopes

unread,
Apr 1, 2013, 8:29:37 AM4/1/13
to dotnetar...@googlegroups.com
2013/4/1 Thiago Aguiar <thiag...@gmail.com>:
> Victor, valew pela resposta, porem a resposta de Juan não responde a
> pergunta. Ele só manda usar algo que eu já tava usando.

Estava escrevendo do celular quando respondi pela primeira vez. O que
todos aqui estão falando é para em vez de:

Func<Tiu_TipoUtilizacao, int?> expression = (u => u.Tiu_Codigo);
Query<Tiu_TipoUtilizacao>(null).Max(expression);

Você deve escrever

Expression<Func<Tiu_TipoUtilizacao, int?>> expression = (u => u.Tiu_Codigo);
Query<Tiu_TipoUtilizacao>(null).Max(expression);

São duas coisas completamente diferentes.

--
https://github.com/juanplopes

Jairo Azevedo

unread,
Apr 1, 2013, 8:30:37 AM4/1/13
to dotnetar...@googlegroups.com
Thiago, responde sim. Você utiliza "Func<Tiu_TipoUtilizacaoint?> expression = (u => u.Tiu_Codigo);" e o que o Juan sugere é que você passe a usar "Expression<Func<Tiu_TipoUtilizacaoint?>> expression = (u => u.Tiu_Codigo);"

Daniel Porfirio

unread,
Apr 1, 2013, 8:33:42 AM4/1/13
to dotnetar...@googlegroups.com
O @Marcus deixou claro a diferença.

"Tentando ser simplista para melhor entendimento:

A Func<> é a passagem da Função ou método propriamente dita. Quando o cara que você passou vai consumir ele chama o que esta dentro dela propriamente dita.

A Expression<Func<>> é +- o metadado da função, que descreve o que tem dentro dela, seus operadores e operandos. O Entity usa isto (o metadado) para converter para Sql, (fazendo um parse da Func<> para Sql). Você mesmo, brincando, pode construir seu próprio Parse de qualquer coisa com Expression<>, vale o lazer."


--
Att,

Daniel Porfirio

Thiago Aguiar

unread,
Apr 1, 2013, 8:40:19 AM4/1/13
to dotnetar...@googlegroups.com
Caralho, Tava olhando o ultimo e-mail de Juan, e exatamente oq eu escrevi, mas fui olhar novamente...


Galera, eu digitei errado, com apenas Func<> nem vai compilar, tem o Expression...Corrigindo


Query<Tiu_TipoUtilizacao>(null).Max((u => u.Tiu_Codigo))
Funcionou perfeito. Max sendo feito no banco.

EXPRESSION<Func<Tiu_TipoUtilizacao, int?>> expression = (u => u.Tiu_Codigo);
Query<Tiu_TipoUtilizacao>(null).Max(expression);
O Max ta sendo feito no Linq.


Agora vamos chegar na minha duvida.

Explicando sem código, a diferença entre os dois exemplos é apenas a variável pegando o expression. Passando direto (Sem variavel), Max no banco. Passando com a variável Max sendo feito no Linq-to-Entity











life runs on code

Thiago Aguiar


2013/4/1 Daniel Porfirio <m...@danielporfirio.com>

--
Reply all
Reply to author
Forward
0 new messages