Ir para conteúdo
abucarub

LINQ no Delphi

Recommended Posts

Olá a todos os "Delpheiros" de plantão. 

Estou com uma dúvida quanto a LINQ no Delphi. 
Hoje eu vi um vídeo demonstrando o uso de um ORM para Delphi. 
Gostaria de entender como funciona o seguinte trecho de código, mais especificamente esse trecho Where( Linq['OrderId'] >= 30 )

 

Orders := Manager.Find<TOrder> 
  .Where( Linq['OrderId'] >= 30  ) 
  .OrderBy('CompanyName') 
  .List;

 

 

alguém saberia me explicar? 

Sei que é retornado uma lista de pedidos, mas minha dúvida é, como tratar um método para receber uma expressão e dentro dele saber quais os valores passados para converter essa expressão em SQL. 
Pois o trecho Where( Linq['OrderId'] >= 30 ) se transforma em WHERE ORDER_ID >= 30 dentro desse método. 

Espero que tenha conseguido explicar rs 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eles se aproveitam da possibilidade de ser possível sobrecarregar os operadores em records http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Operator_Overloading_(Delphi).

 

Possivelmente Linq['OrderId'] retorna um record(que representa a expressão OrderId) que possui o operador >= sobrecarregado para retornar um novo record(contendo a combinação da expressão OrderId com o valor 30).

 

Se o método Where aceitar o record como argumento ótimo, porem caso ele somente aceite uma string então o record deve ter o operador Implicit(conversão implícita) sobrecarregado para que ele possa ser convertido para string de forma transparente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ZecaLoteiro
      Boa tarde,
       
      Estou tentando usar o DISTINCT em uma consulta LINQ porém não está funcionando.
      Implementei tanto a interface IEquatable quando a interface IEqualityComparer mas mesmo assim não é possível distinguir as instâncias.
       
      Alguém já passou por isso? Poderia ajudar?
      Desde já obrigado.
       
      Public Class Teste Implements IEquatable(Of Teste), IEqualityComparer(Of Teste) Private _Codigo As Integer Public Property Codigo() As Integer Get Return _Codigo End Get Set(ByVal value As Integer) _Codigo = value End Set End Property Public Sub New(id As Integer) Me.Codigo = id End Sub Public Overrides Function Equals(obj As Object) As Boolean Return DirectCast(obj, Teste).Codigo = Me.Codigo End Function Public Function Equals1(other As Teste) As Boolean Implements IEquatable(Of Teste).Equals Return Me.Codigo = other.Codigo End Function Public Function Equals2(x As Teste, y As Teste) As Boolean Implements IEqualityComparer(Of Teste).Equals Return x.Codigo = y.Codigo End Function Public Function GetHashCode1(obj As Teste) As Integer Implements IEqualityComparer(Of Teste).GetHashCode Return DirectCast(obj, Teste).Codigo End Function End Class Testando:
       
      Dim p1 As New Teste(78) Dim p2 As New Teste(78) Dim l As New List(Of Teste) From {p1, p2} MsgBox(l.Distinct().Count()) MsgBox(l.Distinct().ToList().Count)  
    • Por Raphael Zago
      Bom dia,
       
      Estou tentando comparar 2 datas, uma delas esta na tabela, e a outra é uma DateTime.Now, que declarei no meu codigo.
       
      alguem pode me sugerir algo ?
       
      obrigado!!
       
       public ActionResult DevolveFicha(int? id)         {             GetBasicData();         //    var data = (from x in db.EPI_REQ_PENDENTES where x.id_REQ == id select x.id_FICHA);             var idf = (from x in db.EPI_REQ_PENDENTES where x.id_REQ == id select x.id_FICHA).FirstOrDefault();             if (idf == null)             {                 return new HttpStatusCodeResult(HttpStatusCode.BadRequest);             }             FICHA_MESTRE fICHA_MESTRE = db.FICHA_MESTRE.Find(idf);             if (fICHA_MESTRE == null)             {                 return HttpNotFound();             }             DateTime hoje = DateTime.Now;                       // DateTime.DATA = DateTime.Parse(EPI_REQ_PENDENTES.)            //DateTime emiss = DateTime.Parse(fICHA_MESTRE.dat_emissao.Value.ToString());             return View(fICHA_MESTRE);         }  
    • Por Marceloj
      Bom dia.
      Estou com dúvida como resolver a consulta linq abaixo,  preciso listar os empreendimentos e tenho 3 tabelas uma é processo que possui sua chave primaria ProcessoId, outra é a tabela movimento que possui sua chave primária MovimentoID e tenho uma tabela de associação entre as duas que possui as chaves estrangeiras processoID  e movimentoID. A classe movimento possui uma coleção de processos e quando tento fazer o join usando a coleção ele não permite, segue o consulta.
       
      var consulta = (from e in jucemgcContext.Empreendimento                             join mv in jucemgcContext.Movimento on e.EmpreendimentoId equals mv.idEmpreendimento                             join p in jucemgcContext.Processo on mv.Processo.Where(t => t.ProcessoId.equals(p.ProcessoId)                             join m in jucemgcContext.Mensagem on p.ProcessoId equals m.ProcessoId                             where p.idTipoProcesso == 6 && m.ProcessoId == p.ProcessoId && mv.idEmpreendimento == e.EmpreendimentoId                             select e);  
      join p in jucemgcContext.Processo on mv.Processo.Where(t => t.ProcessoId.equals(p.ProcessoId) --- Nesta parte do código ele não aceita informar o equals, dá uma mensagem - Invalid expression term 'equals'  )expected.
       
      Desde já agradeço.
       
       
    • Por BrendonPawn
      Bom dia... estou usando uma estrutura semelhante a de baixo, como banco de dados:
      <?xml version="1.0" encoding="utf-8"?> <itens> <item att1="01" att2="02" att3="03" /> <item att1="02" att2="03" att3="04" /> </itens> ... e o seguinte código para obter esses dados e popular minha dataGridview:
      DataSet dataset = new DataSet(); dataset.ReadXml(xmlfile); dataGridView1.DataSource = dataset.Tables["item"]; ... onde a estrutura final da minha dataGridView é:
       
      +---------+---------+---------+
      |   att1  |  att2  |  att3  |
      +---------+---------+---------+
      |   01    |   02    |   03    |
      +---------+---------+---------+
      |   02    |   03    |   04    |
      +---------+---------+---------+
       
      Mas eu queria saber como faço para selecionar qual atributo sera enviado para  datagridview... por exemplo ao invés de exibir att1, att2, e att3 que são todos os atributos, exibir apenas a att1 e a att3 como mostra abaixo:
       
      +---------+---------+
      |   att1  |  att3  | 
      +---------+---------+
      |   01    |   03    | 
      +---------+---------+
      |   02    |   04    | 
      +---------+---------+
       
      Grato desde já!
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.