2013-02-28 7 views
5

Ich arbeite an einer App in MVC4 und Entity Framework 5 und stieß kürzlich auf diese Ausnahme beim Ausführen meiner Abfrage.Problemumgehung wegen fehlender Unterstützung für PadLeft in EF5.x?

{ "LINQ to Entities nicht die Methode 'System.String PadLeft (Int32, Char)' Methode erkennen, und diese Methode kann nicht in einen Laden Ausdruck übersetzt werden."}

Als ich habe ähnliche Fehler in der Vergangenheit durchlaufen, ich habe gerade eine Variable außerhalb der Abfrage gemacht und dann die Variable in der LINQ-Anweisung verwendet. Leider manipuliere ich in diesem Fall die Zeilenergebnisse, daher bin ich mir nicht sicher, wie ich das anstellen soll oder ob das die beste Methode ist. Jede Hilfe wäre willkommen. Meine Frage ist unten:

  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

Können Sie eine zusätzliche berechnete Spalte in der Tabelle, die das 'entity_program' mit der entsprechenden Anzahl von 0s füllt? – cfeduke

+0

das ist eine Möglichkeit, aber ich würde etwas bevorzugen, das wiederverwendbar ist. Ich möchte keine zusätzliche Spalte für jede Spalte erstellen, die ich puffern muss, wenn ich es vermeiden kann. – Elsimer

Antwort

-4

ich Erstellen einer Liste am Ende dann durch die Ergebnisse iterieren. Wenn ich eine .Distinct() in der Liste mache, wird sie an IEnumerable zurückgegeben. Ich bin mir nicht sicher, was die Performance angeht, was besser ist, aber mit etwas Aufwand könnte ich ein PadLeft für LINQ zu Entities erstellen, die ungefähr die gleiche Sache gemacht haben.

  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

Es ist nicht zu elegant, aber es macht den Job:

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

Danke dafür! – David

-2

Ich denke Gert Arnold Lösung in elegant. Hier ist eine echte Lösung basierend auf seiner Antwort:

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

Sorry, das ist Unsinn. Für Sie kann es eine "echte" Lösung sein, für alle anderen (einschließlich der OP) ist es bedeutungslos. Es hat nichts mit OP-Daten zu tun. –

Verwandte Themen