2013-02-28 10 views
5

Sto lavorando a un'app in MVC4 e Entity Framework 5 e di recente ho riscontrato questa eccezione durante l'esecuzione della mia query.Qualsiasi soluzione alternativa per la mancanza di supporto per PadLeft in EF5.x?

{ "LINQ to Entities non riconosce il metodo di 'System.String PadLeft (Int32, Char)' metodo, e questo metodo non può essere tradotto in un'espressione negozio."}

Quando ho ho incontrato errori simili in passato, ho appena creato una variabile al di fuori della query e poi ho usato la variabile nell'istruzione LINQ. Sfortunatamente, in questo caso sto manipolando i risultati della riga, quindi non sono sicuro di come procedere o se è il metodo migliore. Qualsiasi aiuto sarebbe apprezzato. La mia domanda è qui sotto:

  IQueryable<System.String> LEAPrograms = db.Datamart_Draft 
      .Where(where => where.snapshot_id == snapshot_id 
       && !String.IsNullOrEmpty(where.entity_program)) 
      .Select(sel => (sel.entity_program.PadLeft(PROGRAMLENGTH, '0'))).Distinct(); 
+1

Si può creare una colonna calcolata aggiuntiva sulla tabella che riempie il 'entity_program' con il numero appropriato di 0s? – cfeduke

+0

questa è una possibilità, ma preferirei qualcosa che sia riutilizzabile. Non voglio creare una colonna aggiuntiva per ogni colonna che ho bisogno di pad se posso evitarlo. – Elsimer

risposta

-4

ho finito per creare una lista poi scorrendo i risultati. Quando faccio un .Distinct() sull'Elenco, lo restituisce a un oggetto IEnumerable. Non sono sicuro per quanto riguarda le prestazioni, il che è meglio, ma con qualche sforzo penso che un PadLeft possa essere creato per LINQ alle Entità che hanno fatto circa la stessa cosa.

  IEnumerable<String> LEAPrograms = db.Datamart_Draft.Where(wh => wh.snapshot_id == snapshot_id && !String.IsNullOrEmpty(wh.entity_program)).Select(se => se.entity_program).Distinct(); 
     // create and populate a List (because LINQ to Entities doesn't support PadLeft) 
     List<String> PaddedPrograms = new List<String>(); 
     foreach (var row in LEAPrograms) 
     { 
      PaddedPrograms.Add(row.PadLeft(4, '0')); 
     } 
     LEAPrograms = PaddedPrograms.Distinct(); 
12

Non è troppo elegante, ma non il lavoro:

... 
.Select(sel => SqlFunctions.Replicate 
        ("0", PROGRAMLENGTH - sel.entity_program.Length) 
      + sel.entity_program) 
+0

Grazie per questo! – David

-2

Penso che la soluzione di Gert Arnold sia elegante. Ecco una soluzione reale basata sulla sua risposta:

List<string> samplesWithoutMeasures = new List<string>(); 
samplesWithoutMeasures = (from mm in DB.MEDICIONESMUESTRA 
    join mu in DB.MUESTRAS on mm.IDMUESTRA equals mu.IDMUESTRA 
    where (mu.IDESTADOMUESTRA >= 7 && mu.IDESTADOMUESTRA <= 8) && (mu.ESDUPLICADODE == null) && 
      (mm.IDESTADOMEDICIONMUESTRA == 1 && mm.IDPARAMETRO == Parameter.IDPARAMETRO) && 
      (mu.FECHARADICACION >= StartDate && mu.FECHARADICACION <= EndDate) 
    select SqlFunctions.Replicate("0", 15 - (SqlFunctions.StringConvert((double)mm.IDMUESTRA).Trim()).Length) 
      + SqlFunctions.StringConvert((double)mm.IDMUESTRA).Trim() 
    ).ToList(); 
+1

Siamo spiacenti, questa è una sciocchezza. Per te potrebbe essere una soluzione "reale", per tutti gli altri (incluso l'OP) non ha senso. Non ha nulla a che fare con i dati di OP. –

Problemi correlati