Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

  • Conteúdo Similar

    • Por mr22robot
      Ola caros amigos. 
      Estou com uma dúvida aqui que embora nao tenho achado ainda uma resposta, acredito que haja.
      Estou estudando a tão sonhada linguagem de programação asp.net core mvc. Linguagem essa que demorei 5 anos pra iniciar os estudos rsrs.
      Mas estou agarrado em uma situação. 
      Estou usando como base de dados nos meus estudos um banco Oracle. Que já tem algumas informações nele. Utilizei o SCAFFOLD para criar as classes e o contexto baseado no banco e tabelas existentes. 
      Porem agora na fase das consultas, estou perdido em como utilizar o IN que eu utilizo no oracle; no LINQ.
      Ex: 
      SELECT CODPROD,DESCRICAO FROM PRODUTO WHERE CODPROD IN(1,2,3,4,5,6) Como eu utilizo esse filtro com uma restrição de códigos de produtos? no caso o where codprod in(1,2,3,4,5,6) ?.
      Desde já obrigado pela ajuda.
    • Por dudepaiva
      Boa tarde!
      Estou buscando os dados em uma planilha e adicionando em uma lista. Antes de adicionar em uma lista, utilizo o GROUPBY para agrupar a informação desejada, até aqui tudo bem, porém quando tento lançar essa informação num COMBOBOX, ocorre erro de parametro.
      A primeira linha em negrito, é onde busco e agrupo as informações. A segunda é onde ocorre o erro.
       
      Segue código:
       
      Quero trazer os dois campos abaixo.
       
      public class ProdutoDTO
          {
              private string codigo;
              private string nomeTributario;
              private string linhaReduzida;
              private string linha;
              private string marcaReduzida;
              private string marca;
              private string gramatura;
              public ProdutoDTO()
              {
              }
              public ProdutoDTO(string codigo, string nomeTributario, string linhaReduzida, string linha, string marcaReduzida, string marca, string gramatura)
              {
                  this.Codigo = codigo;
                  this.nomeTributario = nomeTributario;
                  this.linhaReduzida = linhaReduzida;
                  this.linha = linha;
                  this.marcaReduzida = marcaReduzida;
                  this.marca = marca;
                  this.gramatura = gramatura;
              }
              public string Codigo { get => codigo; set => codigo = value; }
              public string NomeTributario { get => nomeTributario; set => nomeTributario = value; }
              public string LinhaReduzida { get => linhaReduzida; set => linhaReduzida = value; }
              public string Linha { get => linha; set => linha = value; }
              public string MarcaReduzida { get => marcaReduzida; set => marcaReduzida = value; }
              public string Marca { get => marca; set => marca = value; }
              public string Gramatura { get => gramatura; set => gramatura = value; }
          }
       
      A primeira linha em negrito, é onde busco e agrupo as informações. A segunda é onde ocorre o erro.
       
      private void AbrirArquivoExcel()
              {
                  //Configura OpenFileDialog.
                  OpenFileDialog openFD = new OpenFileDialog();
                  openFD.Title = "Localizar arquivo";
                  openFD.InitialDirectory = @"C:\Documentos\Planilhas";
                  openFD.Filter = "Arquivo Excel (*.xlsx) | *.xlsx";
                  openFD.CheckFileExists = true;
                  openFD.CheckPathExists = true;
                  openFD.ShowReadOnly = true;
                  openFD.RestoreDirectory = true;
                  openFD.ReadOnlyChecked = true;
                  if (openFD.ShowDialog() == DialogResult.OK)
                  {
                      try
                      {
                          txtOpenFD.Text = openFD.FileName;
                          var produtos = produtoBLL.Buscar(openFD.FileName, "Dados").GroupBy(x => x.Linha).ToList();
                          cbLinha.DataSource = produtos;
                          cbLinha.ValueMember = "Codigo";
                          cbLinha.DisplayMember = "Linha";
                          cbLinha.SelectedIndex = -1;
                          cbLinha.Text = "Selecione";
                          //CarregarComboBox(cbLinha, produtos, "Linha", "LinhaReduzida");
                      }
                      catch (Exception)
                      {
                          throw;
                      }
                  }
              }
       
      Desde já agradeço a ajuda! Já quebrei a cabeça!

    • 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.
       
       
×

Informação importante

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