2016-04-06 21 views
2

muss ich diesen Ausdruck auszuführen:Linq To Entities Internal Conversion

var CAP = modelCap.AZCPC00F.Where(x => x.CPCVER == CPCVER && x.CPCNAR == CPCNAR && x.CPCCAP == CPCCAP) 
           .Where(x => XXXXKG == 0 ? true : Convert.ToInt64(Convert.ToDouble(x.CPCLKG)) < XXXXKG) 
           .Where(x => XXXXMC == 0 ? true : Convert.ToInt64(Convert.ToDouble(x.CPCLMC)) < XXXXMC) 
           .Where(x => XXXXFD == "N" ? true : x.CPCZFD == XXXXFD).FirstOrDefault(); 

Wenn ich versuche, dies auszuführen, habe ich eine Ausnahme auf der internen Umwandlung von x.CPCLKG. Die Ausnahme ist:

LINQ zu Entities erkennt die Methode Methode 'int64' nicht, und diese Methode kann nicht in einen Ausdruck im Speicher übersetzt werden.

Ich weiß, dass das Problem in der Konvertierung ist, aber wie kann ich diese Funktion verwenden?

Ein Beispiel für x.CPCLKG ist 9.9999 und ist ein nChar-Zeichentyp.

Vielen Dank an alle

+0

Können Sie versuchen, double.Parse und long.Parse statt Convert.ToInt64 und Convert.ToDouble zu verwenden? – Thomas

Antwort

1

Sie müssen die Logik haben, die sich im Speicher in einem auf Entitäten in Linq unterstützt Abfrage erfolgt nicht. Wir können dies tun, indem wir ToList() für die Teile der Abfrage aufrufen, die unterstützt werden. Dadurch werden diese Teile ausgeführt und die Ergebnisse als Liste zurückgegeben. Wir können dann ausführen, was Linq auf dieser Liste im Speicher unterstützt.

var CAP = modelCap.AZCPC00F.Where(x => x.CPCVER == CPCVER && x.CPCNAR == CPCNAR && x.CPCCAP == CPCCAP) 
          .Where(x => XXXXFD == "N" ? true : x.CPCZFD == XXXXFD) 
          .ToList(); 

var CAP2 = CAP.Where(x => XXXXKG == 0 ? true : Convert.ToInt64(Convert.ToDouble(x.CPCLKG)) < XXXXKG) 
       .Where(x => XXXXMC == 0 ? true : Convert.ToInt64(Convert.ToDouble(x.CPCLMC)) < XXXXMC).FirstOrDefault() 
+0

Mit Ihrem Code habe ich die gleiche Ausnahme – Ale

+0

@Ale was sind die ypes von CPCLKG, CPCLMC, ....? – Thomas

+0

@Ale Ich habe vergessen, ToList() zur ersten Abfrage hinzuzufügen. Ohne dies hatten Ihre Abfrage und meine das gleiche Ergebnis. ToList() führt diese Abfrage aus und bringt die Liste in den Speicher, und die zweite Abfrage arbeitet dann im Speicher. – gnalck