2010-08-13 19 views
7

Ich bin ein Neuling mit dem IQueryable, Lambda-Ausdrücke und LINQ im Allgemeinen. Ich möchte eine Unterabfrage in einer where-Klausel wie folgt setzen:LINQ Unterabfrage IN

Beispielcode:

SELECT * FROM CLIENT c WHERE c.ETAT IN (
SELECT DDV_COLUMN_VAL FROM DATA_DICT_VAL 
WHERE TBI_TABLE_NAME = 'CLIENT' AND DD_COLUMN_NAME = 'STATUS' 
      AND DDV_COLUMN_VAL_LANG_DSC_1 LIKE ('ac%')) 

Wie übersetze ich dies in LINQ?

Antwort

12
var innerquery = from x in context.DataDictVal 
       where x.TbiTableName == myTableNameVariable 
        && x.DdColumnName == "Status" 
        && x.DdbColumnValLangDsc1.StartsWith("ac") 
       select x.DdvColumnVal; 

var query = from c in context.Client 
      where innerquery.Contains(c.Etat) 
      select c; 
+0

Wir haben einen Gewinner Vielen Dank kbrimington Altough Ich mag ein bisschen mehr verstehen, hätte Möchten Sie einen guten haben.!.. Lesen Sie Vorschläge zu LINQ, IQueryable und Lambda-Ausdrücken? Nochmals vielen Dank! –

+0

Obwohl es mit diesem genauen Szenario nicht helfen würde, habe ich eine Menge Kilometer aus dem Lesen dieser Beispiele: http://msdn.microsoft.com/en-us /vcsharp/aa336746.aspx Ich habe auch eine Menge aus der Serie von Scott Gu über Linq-to-SQL gelernt: http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql -part-1.aspx – kbrimington

+0

Für mich funktioniert das nicht. .Contains (column) erstellt EXISTS(), was nicht dasselbe ist wie IN(). Ich habe versucht, dies in meinem Projekt zu tun und EXISTS() erstellt Ich bekomme ungefähr 700 weitere Zeilen zurück. – ScubaSteve

1

Wenn Sie neu bei Linq sind, benötigen Sie unbedingt zwei wichtige Werkzeuge. Der erste ist ein Werkzeug, das die meisten T-SQL-Anweisungen in Linq namens Linqer (http://www.sqltolinq.com/) konvertiert. Dies sollte die Abfrage in Ihrer Frage kümmern. Das andere Werkzeug ist LinqPad (http://www.linqpad.net/). Dies wird Ihnen helfen, Linq beim Üben mit Abfragen zu lernen.

Ich benutze oft Linqer, um eine T-SQL-Abfrage für mich zu konvertieren, und verwenden Sie dann LinqPad, um es fein abzustimmen.

+0

Danke! Ich habe bereits LinqPad, jetzt werde ich den Linqer bekommen. –

4
from c in db.Client 
where (from d in db.DataDictVal 
     where d.TblTableName == "Client" 
     && d.DDColumnName == "Status" 
     && dd.DdvColumnValLandDsc1.StartsWith("ac")) 
     .Contains(c.Etat) 
select c; 
+0

:(Sie geben zu schnell –

+0

FYI: Sie sind auf der inneren Abfrage der Auswahl Ausdruck fehlt – kbrimington

0

Elbe Beispiel mit Linq Methode Syntax:

var innerquery = dbcontext.DataDictVal     
       .where(x=> x.TbiTableName == myTableNameVariable 
        && x.DdColumnName == "Status" 
        && x.DdbColumnValLangDsc1.StartsWith("ac")) 
       .select(x=>x.DdvColumnVal) 

var query = dbcontext.Client 
      .where(c=>innerquery.Contains(c.Etat)) 

Hinweis:

Sind diese Antwort zu geben, denn wenn ich die Antwort gesucht, konnte ich nicht finden viel Antwort, die das gleiche Konzept in der Methodensyntax erklärt.

Also In Zukunft kann es für die Menschen nützlich sein, diejenigen, die im Darm sucht Methodensyntax wie ich heute. Danke karthik

+1

Ich glaube nicht, das notwendig ist, aber zumindest könnte man es –

+0

yup syntaktisch korrekt machen, ich diese jetzt hinzufügen, für diejenigen, die die Methode Syntax von Linq verwenden in der Regel .hope es für sie nützlich sein können –

+0

Ja, aber die Umwandlung ist in diesem Fall nicht wirklich Raketenwissenschaft. Aber auch hier ist die Syntax nicht korrekt (Kleinschreibung). –