2016-08-09 245 views
0

Ich habe das folgende Problem, bei dem Versuch, zwei Tabellen in Oracle beizutreten. Eine der Tabellen hat einen String-Wert und der andere ist ein Long-Wert.C# Linq Oracle lange konvertieren zu Zeichenfolge für Join

var query = (from d in context.entity 
join m in context.entity2 
on d.ordernum.Substring(2) equals m.ordernum.ToString()) 
select new { d.ordernum, d.customer, m.recordkey}); 
var items = query.ToList(); 

Das Problem ist, dass dies nicht mit Oracle

funktioniert
  1. Cant Verwendung SQLFunctions, da dies eine Oracle-Datenbank

  2. Cant verwenden .ToString()

    LINQ to Entitäten erkennt die Methode 'System.String ToString()' nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.

  3. Guss Verwendung long.Parse()

    LINQ to Entities erkennt nicht die Methode 'Int64 Parse (System.String)' Methode, und dieses Verfahren kann nicht in einen Laden Ausdruck übersetzt werden.

Alle Hilfen würden geschätzt werden.

+0

'ToString' in LINQ to Entities unterstützt. Welche Version von EF verwenden Sie? –

+0

Die EF ist 6.1.3 und wie oben gezeigt, wenn wir die ToString() verwenden, erhalten wir den Fehler, dass Linq die Methode nicht erkennt. – Denisjc

Antwort

0

Sie können AsEnumerable() verwenden und daher wird es in der C# ausgeführt und diese Fehler nicht erhalten.

var reault = (from d in context.entity.AsEnumerable() 
      join m in context.entity2.AsEnumerable() 
      on d.ordernum.Substring(2) equals m.ordernum.ToString() 
      select new 
      { 
       d.ordernum, 
       d.customer, 
       m.recordkey 
      }).ToList(); 

Andernfalls können Sie es erweitern und write your "own" functions. So etwas wie: (nicht getestet)

<Function Name="OracleSubString" ReturnType="Edm.String"> 
    <Parameter Name="order_number" Type="System.Int64" /> 
    <Parameter Name="start_index" Type="System.Int32" /> 
    <DefiningExpression> 
    SUBSTR(CAST (order_number as varcahr(100)),start_index, LEN(CAST (order_number as varcahr(100)) - start_index) 
    </DefiningExpression> 
</Function> 
+1

Ich denke durch meinen gesunden Menschenverstand, dass er versucht, die Abfrage auf der Datenbank zu bekommen, statt alle Elemente in den Speicher zu packen. Ist nicht machbar, denke ich. – anotherNeo

+0

@anotherNeo - Ich würde auch in der Datenbank bevorzugen, aber von dem, was ich derzeit weiß "SqlFunctions" ist der Weg (aber nicht für Oracle von dem, was er sagt ..) –

+0

@Denisjc - die Funktion der 'AsEnumerable()' oder die "Schreib deine eigenen Funktionen"? –