2010-08-13 10 views
7

Sono un principiante con IQueryable, espressioni lambda e LINQ in generale. Vorrei mettere un subquery in una clausola WHERE come questo:Sottoquery LINQ IN

codice di esempio:

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%')) 

Come faccio a tradurre questo in LINQ?

risposta

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

Abbiamo un vincitore! Grazie mille kbrimington. Anche se mi piacerebbe capire un po 'di più. leggendo suggerimenti su LINQ, IQueryable e espressioni lambda? Grazie ancora! –

+0

Anche se non sarebbe di aiuto con questo scenario esatto, ho avuto un sacco di miglia di lettura di questi esempi: http://msdn.microsoft.com/en-us /vcsharp/aa336746.aspx Ho anche imparato molto dalla serie di Scott Gu su Linq-to-SQL: http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql -part-1.aspx – kbrimington

+0

Per me, questo non funziona .Contains (column) crea EXISTS() che non è lo stesso di IN(). Stavo cercando di farlo nel mio progetto e perché crea EXISTS() Ricevo circa 700 nuove righe restituite. – ScubaSteve

1

Se sei nuovo in Linq, hai bisogno di due strumenti essenziali. Il primo è uno strumento che converte la maggior parte delle istruzioni T-SQL in Linq chiamato Linqer (http://www.sqltolinq.com/). Questo dovrebbe occuparsi della query nella tua domanda. L'altro strumento è LinqPad (http://www.linqpad.net/). Questo ti aiuterà a imparare Linq mentre ti eserciti con le domande.

Spesso utilizzo Linqer per convertire una query T-SQL per me, quindi utilizzare LinqPad per ottimizzarlo.

+0

Grazie! Ho già LinqPad, ora avrò il Linqer. –

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

:(Digiti troppo veloce! –

+0

Nota: Manca l'espressione select nella query interna – kbrimington

0

Stesso esempio con il metodo LINQ sintassi:

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)) 

Nota:

sto fornendo questa risposta, perché quando ho cercato per la risposta, non ho trovato molto risposta che spiega lo stesso concetto nella sintassi del metodo.

Quindi, in futuro, potrebbe essere utile per le persone, coloro che cercavano intestinalmente la sintassi del metodo come me oggi. Grazie karthik

+1

Non penso che sia necessario, ma almeno potresti renderlo sintatticamente corretto –

+0

sì, lo aggiungo ora, per coloro che generalmente usano la sintassi del metodo di linq .hope potrebbe essere utile per loro –

+0

Sì, ma il la conversione non è davvero una scienza missilistica in questo caso. Ma ancora, la sintassi non è corretta (in minuscolo). –