2011-12-07 28 views
0

キャストに問題があります。 提案がありますか?キャストLINQエラー

ありがとうございました。

エラー:LINQ to Entitiesが 'System.DateTime ToDateTime(System.String)'メソッドを認識せず、このメソッドをストア式に変換できません。

public IEnumerable<documento> BuscarDocumento(string jsonBusca, out int quantidadeTotalDocumentos, int chave) 
     { 
      try 
      { 
       ValidaSessaoUsuario(chave); 
       DateTime dataDe; 
       DateTime dataAte; 

       // TODO Permissões - TipoDocumento 
       var contexto = new Contexto(); 
       var documentoBusca = JsonConvert.DeserializeObject<DocumentoBusca>(jsonBusca); 

       IEnumerable<documento> querylinq = contexto.documentoes 
        .Include("documento_indice") 
        .Where(a => a.id_tipodocumento == documentoBusca.id_tipodocumento && a.ativo == true); 

       if (!String.IsNullOrEmpty(documentoBusca.dataDe) && String.IsNullOrEmpty(documentoBusca.dataAte)) 
       { 
        dataDe = DateTime.Parse(documentoBusca.dataDe); 
        querylinq = querylinq.Where(a => a.timestamp >= dataDe && a.timestamp <= DateTime.Now); 
       } 
       else if (String.IsNullOrEmpty(documentoBusca.dataDe) && !String.IsNullOrEmpty(documentoBusca.dataAte)) 
       { 
        dataAte = DateTime.Parse(documentoBusca.dataAte); 
        querylinq = querylinq.Where(a => a.timestamp <= dataAte); 
       } 
       else if (!String.IsNullOrEmpty(documentoBusca.dataDe) && !String.IsNullOrEmpty(documentoBusca.dataAte)) 
       { 
        dataDe = DateTime.Parse(documentoBusca.dataDe); 
        dataAte = DateTime.Parse(documentoBusca.dataAte).AddDays(1); 
        querylinq = querylinq.Where(a => a.timestamp >= dataDe && a.timestamp <= dataAte); 
       }  

       foreach (var indice in documentoBusca.IndiceBusca) 
       { 
        switch (indice.tipoDado) 
        { 
         case (int)Tipo.String: 
         case (int)Tipo.ComboBox: 
          querylinq = querylinq.Join(
          contexto.documento_indice.Where(a => a.id_indice == indice.id && a.valor == indice.valor), 
          doc => doc.id, ind => ind.id_documento, (doc, ind) => doc);        
          break; 
         case(int)Tipo.Inteiro: 
          querylinq = querylinq.Join(contexto.documento_indice.Where(ObterPredicadoInteiro(indice)), 
          doc => doc.id, ind => ind.id_documento, (doc, ind) => doc);        
          break; 
         case (int)Tipo.Data: 
          querylinq = querylinq.Join(
          contexto.documento_indice.Where(ObterPredicadoData(indice)), 
          doc => doc.id, ind => ind.id_documento, (doc, ind) => doc);        
          break; 
        } 
       } 

       quantidadeTotalDocumentos = querylinq.Count(); 

       return querylinq 
        .OrderBy(a => a.id) 
        .Skip(documentoBusca.resultado_inicial) 
        .Take(documentoBusca.resultados_pagina); 
      } 
      catch (FaultException<DetalhesErro> e) 
      { 
       throw e; 
      } 
      catch (Exception e) 
      { 
       DetalhesErro tokenErro = new DetalhesErro(e, "Erro ao buscar a lista de documentos."); 
       throw new FaultException<DetalhesErro>(tokenErro, new FaultReason(tokenErro.mensagemCurta)); 
      } 
     } 

     private Expression<Func<documento_indice, bool>> ObterPredicadoString(IndiceBusca indice) 
     { 
      try 
      { 
       switch (indice.operador) 
       { 
        case "=": 
         return a => a.id_indice == indice.id && a.valor == indice.valor; 
        case "A*": 
         return a => a.id_indice == indice.id && a.valor.StartsWith(indice.valor); 
        case "*A*": 
         return a => a.id_indice == indice.id && a.valor.Contains(indice.valor); 
        case "<>": 
         return a => a.id_indice == indice.id && a.valor != indice.valor;      
        default: 
         return a => true; 
       } 
      } 
      catch (FaultException<DetalhesErro> e) 
      { 
       throw e; 
      } 
      catch (Exception e) 
      { 
       DetalhesErro tokenErro = new DetalhesErro(e, "Erro ao obter o predicado."); 
       throw new FaultException<DetalhesErro>(tokenErro, new FaultReason(tokenErro.mensagemCurta)); 
      } 
     } 

     private Expression<Func<documento_indice, bool>> ObterPredicadoInteiro(IndiceBusca indice) 
     { 
      try 
      { 
       int valorInt = int.Parse(indice.valor); 

       switch (indice.operador) 
       { 
        case "=": 
         return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) == valorInt;     
        case "<>": 
         return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) != valorInt; 
        case ">": 
         return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) > valorInt; 
        case "<": 
         return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) < valorInt; 
        case ">=": 
         return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) >= valorInt; 
        case "<=": 
         return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) <= valorInt; 
        default: 
         return a => true; 
       } 
      } 
      catch (FaultException<DetalhesErro> e) 
      { 
       throw e; 
      } 
      catch (Exception e) 
      { 
       DetalhesErro tokenErro = new DetalhesErro(e, "Erro ao obter o predicado."); 
       throw new FaultException<DetalhesErro>(tokenErro, new FaultReason(tokenErro.mensagemCurta)); 
      } 
     } 

     private Expression<Func<documento_indice, bool>> ObterPredicadoData(IndiceBusca indice) 
     { 
      try 
      { 
       DateTime data = Convert.ToDateTime(indice.valor); 

       switch (indice.operador) 
       { 
        case "=": 
         return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) == data; 
        case "<>": 
         return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) != data; 
        case ">": 
         return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) > data; 
        case "<": 
         return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) < data; 
        case ">=": 
         return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) >= data; 
        case "<=": 
         return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) <= data; 
        default: 
         return a => true; 
       } 
      } 
      catch (FaultException<DetalhesErro> e) 
      { 
       throw e; 
      } 
      catch (Exception e) 
      { 
       DetalhesErro tokenErro = new DetalhesErro(e, "Erro ao obter o predicado."); 
       throw new FaultException<DetalhesErro>(tokenErro, new FaultReason(tokenErro.mensagemCurta)); 
      } 
     } 

答えて

0

私はこの問題を解決しました。 すぐに読み込む必要があります contexto.documento_indice。 ToListメソッド() .Where(ObterPredicadoInteiro(indice)) とのFuncを返すようにする方法を変更...

完全解消。

public IEnumerable<documento> BuscarDocumento(string jsonBusca, out int quantidadeTotalDocumentos, int chave) 
    { 
     try 
     { 
      ValidaSessaoUsuario(chave); 
      DateTime dataDe; 
      DateTime dataAte; 

      // TODO Permissões - TipoDocumento 
      var contexto = new Contexto(); 
      var documentoBusca = JsonConvert.DeserializeObject<DocumentoBusca>(jsonBusca); 

      IEnumerable<documento> querylinq = contexto.documentoes 
       .Include("documento_indice") 
       .Where(a => a.id_tipodocumento == documentoBusca.id_tipodocumento && a.ativo == true); 


      if (!String.IsNullOrEmpty(documentoBusca.dataDe) && String.IsNullOrEmpty(documentoBusca.dataAte)) 
      { 
       dataDe = DateTime.Parse(documentoBusca.dataDe); 
       querylinq = querylinq.Where(a => a.timestamp >= dataDe && a.timestamp <= DateTime.Now); 
      } 
      else if (String.IsNullOrEmpty(documentoBusca.dataDe) && !String.IsNullOrEmpty(documentoBusca.dataAte)) 
      { 
       dataAte = DateTime.Parse(documentoBusca.dataAte); 
       querylinq = querylinq.Where(a => a.timestamp <= dataAte); 
      } 
      else if (!String.IsNullOrEmpty(documentoBusca.dataDe) && !String.IsNullOrEmpty(documentoBusca.dataAte)) 
      { 
       dataDe = DateTime.Parse(documentoBusca.dataDe); 
       dataAte = DateTime.Parse(documentoBusca.dataAte).AddDays(1); 
       querylinq = querylinq.Where(a => a.timestamp >= dataDe && a.timestamp <= dataAte); 
      } 

      if (documentoBusca.IndiceBusca != null && documentoBusca.IndiceBusca.Count() > 0) 
      { 
       foreach (var indice in documentoBusca.IndiceBusca) 
       { 
        switch (indice.tipoDado) 
        { 
         case (int)Tipo.String: 
         case (int)Tipo.ComboBox: 
          querylinq = querylinq.Join(
          contexto.documento_indice.Where(ObterPredicadoString(indice)), 
          doc => doc.id, ind => ind.id_documento, (doc, ind) => doc); 
          break; 
         case (int)Tipo.Inteiro: 
          querylinq = querylinq.Join(contexto.documento_indice.ToList().Where(ObterPredicadoInteiro(indice)), 
          doc => doc.id, ind => ind.id_documento, (doc, ind) => doc); 
          break; 
         case (int)Tipo.Data: 
          querylinq = querylinq.Join(
          contexto.documento_indice.ToList().Where(ObterPredicadoData(indice)), 
          doc => doc.id, ind => ind.id_documento, (doc, ind) => doc); 
          break; 
        } 
       } 
      } 

      quantidadeTotalDocumentos = querylinq.Count(); 

      return querylinq 
       .OrderBy(a => a.id) 
       .Skip(documentoBusca.resultado_inicial) 
       .Take(documentoBusca.resultados_pagina); 
     } 
     catch (FaultException<DetalhesErro> e) 
     { 
      throw e; 
     } 
     catch (Exception e) 
     { 
      DetalhesErro tokenErro = new DetalhesErro(e, "Erro ao buscar a lista de documentos."); 
      throw new FaultException<DetalhesErro>(tokenErro, new FaultReason(tokenErro.mensagemCurta)); 
     } 
    } 

    private Func<documento_indice, bool> ObterPredicadoString(IndiceBusca indice) 
    { 
     try 
     { 
      switch (indice.operador) 
      { 
       case "=": 
        return a => a.id_indice == indice.id && a.valor.ToLower() == indice.valor.ToLower(); 
       case "A*": 
        return a => a.id_indice == indice.id && a.valor.ToLower().StartsWith(indice.valor.ToLower()); 
       case "*A*": 
        return a => a.id_indice == indice.id && a.valor.ToLower().Contains(indice.valor.ToLower()); 
       case "<>": 
        return a => a.id_indice == indice.id && a.valor.ToLower() != indice.valor.ToLower();      
       default: 
        return a => true; 
      } 
     } 
     catch (FaultException<DetalhesErro> e) 
     { 
      throw e; 
     } 
     catch (Exception e) 
     { 
      DetalhesErro tokenErro = new DetalhesErro(e, "Erro ao obter o predicado."); 
      throw new FaultException<DetalhesErro>(tokenErro, new FaultReason(tokenErro.mensagemCurta)); 
     } 
    } 

    private Func<documento_indice, bool> ObterPredicadoInteiro(IndiceBusca indice) 
    { 
     try 
     { 
      int valorInt = int.Parse(indice.valor); 

      switch (indice.operador) 
      { 
       case "=": 
        return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) == valorInt;     
       case "<>": 
        return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) != valorInt; 
       case ">": 
        return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) > valorInt; 
       case "<": 
        return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) < valorInt; 
       case ">=": 
        return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) >= valorInt; 
       case "<=": 
        return a => a.id_indice == indice.id && Convert.ToInt32(a.valor) <= valorInt; 
       default: 
        return a => true; 
      } 
     } 
     catch (FaultException<DetalhesErro> e) 
     { 
      throw e; 
     } 
     catch (Exception e) 
     { 
      DetalhesErro tokenErro = new DetalhesErro(e, "Erro ao obter o predicado."); 
      throw new FaultException<DetalhesErro>(tokenErro, new FaultReason(tokenErro.mensagemCurta)); 
     } 
    } 

    private Func<documento_indice, bool> ObterPredicadoData(IndiceBusca indice) 
    { 
     try 
     { 
      DateTime data = Convert.ToDateTime(indice.valor); 

      switch (indice.operador) 
      { 
       case "=": 
        return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) == data; 
       case "<>": 
        return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) != data; 
       case ">": 
        return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) > data; 
       case "<": 
        return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) < data; 
       case ">=": 
        return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) >= data; 
       case "<=": 
        return a => a.id_indice == indice.id && Convert.ToDateTime(a.valor) <= data; 
       default: 
        return a => true; 
      } 
     } 
     catch (FaultException<DetalhesErro> e) 
     { 
      throw e; 
     } 
     catch (Exception e) 
     { 
      DetalhesErro tokenErro = new DetalhesErro(e, "Erro ao obter o predicado."); 
      throw new FaultException<DetalhesErro>(tokenErro, new FaultReason(tokenErro.mensagemCurta)); 
     } 
    } 

・ホープ、このことができます....

関連する問題