2009-04-28 11 views
0

Ich habe Probleme mit der folgenden SQL-Anweisung zu LINQ-to-Entities konvertieren:Wie generische Sammlungen verwenden, zusammen mit LINQ-to-Entities

SELECT l.* 
FROM locations l 
WHERE l.id NOT IN (/* array of ids */) 

In LINQ, würde Ich mag, wie etwas sehen (wo myCollection eine generische Liste der Elemente ist ausgeschlossen):

IQueryable<Location> locationQuery = from l in DataContext.Location 
            where !myCollection.Contains(l) 
            select l; 

Aber das wird da nicht funktionieren enthält, ist in LINQ-to-Entities nicht verfügbar (wie ich es sehen). In meinem besten/am nächsten LINQ Versuch habe ich meine Sammlung von Locations (eine Liste), und ich habe einen Datacontext, die alle bestehenden Standorte aus der Datenbank abruft:

List<Location> Route = new List<Location>(); 

// Some code to add Location entities from the DB to the Route collection 

var innerQuery = from p in Route 
       select p.ID; 

IQueryable<Location> locationQuery = from l in DataContext.Location 
            where !((innerQuery).Any(k => k == l.ID)) 
            select l; 

Offensichtlich mag ich alle Standorte von dem bekommen DB, die nicht in meiner lokalen Sammlung sind. Der Code löst jedoch eine NotSupportedException aus:

Es konnte kein konstanter Wert vom Typ 'Closure type' erstellt werden. Nur primitive Typen ('wie Int32, String und Guid') werden in diesem Kontext unterstützt.

Ich habe damit herumgespielt, mit verschiedenen Ansätzen, aber ich kann es einfach nicht zum Laufen bringen. Jetzt habe ich gelesen, dass LINQ-to-Entities nicht zu High-Level-Vergleichen (Objektebene) fähig ist, was den oben genannten Fehler erklären könnte.

Meine eigentliche Frage ist, wie mache ich in LINQ was ich so leicht in SQL machen kann? Ich möchte nur eine Reihe von Entitäten aus der DB auswählen, die Entitäten ausschließen, die in der lokalen Sammlung (nicht DB) vorhanden sind.

+0

Willkommen bei LINQ-to-Entities, der Ersatz für LINQ to SQL, die nicht halb so funktioniert ... –

+0

ich hier eine ähnliche Umwandlung Frage aufgeworfen; http://stackoverflow.com/questions/4093592/how-to-lookup-entities-in-entityframework-4-by-a-finder-interface-works-in-linq, die ich noch kein Glück bei der Lösung hatte. Es scheint, dass Sie in LinqToSql viele Dinge tun können, die Sie in EF nicht tun können. Es ist sehr nervig/enttäuschend. Ihre Frage ist ein bisschen anders, aber das Endergebnis ist ähnlich. Ich hoffe, du hast mehr Erfolg als ich. –

Antwort

2

Versuchen Sie diesen Beitrag: "NOT IN" clause in LINQ to Entities

+0

Vielen Dank für diesen Link, ich habe meinen Weg zu http://blogs.msdn.com/phaniraj/archive/2008/07/17/set-based-operations-in-ado-net-data-services gefunden. aspx. Ich könnte es auf diese Weise funktionieren lassen, aber scheißlich (nichts für ungut!), Gibt es nicht einen weniger komplexen Weg, etwas so Triviales zu tun? – pyrocumulus

Verwandte Themen