2010-08-13 18 views
7

Soy un novato con las expresiones IQueryable, lambda y LINQ en general. Me gustaría poner una subconsulta en una cláusula where así:Subconsulta de LINQ EN

Código de ejemplo:

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

¿Cómo se traduce esto en LINQ?

Respuesta

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

¡Tenemos un ganador! Muchas gracias kbrimington. Aunque me gustaría saber un poco más. ¿Te gustaría tener algo bueno? leyendo sugerencias sobre expresiones LINQ, IQueryable y lambda? Gracias de nuevo! –

+0

Aunque no ayudaría en este escenario exacto, obtuve muchos beneficios al leer estos ejemplos: http://msdn.microsoft.com/en-us /vcsharp/aa336746.aspx. También aprendí mucho de la serie de Scott Gu sobre Linq-to-SQL: http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql -part-1.aspx – kbrimington

+0

Para mí, esto no funciona. Contiene (columna) crea EXISTS() que no es lo mismo que IN(). Intenté hacer esto en mi proyecto y porque crea EXISTS() Recibo unas 700 filas más. – ScubaSteve

1

Si es nuevo en Linq, absolutamente necesita dos herramientas esenciales. La primera es una herramienta que convierte la mayoría de las sentencias de T-SQL a Linq llamadas Linqer (http://www.sqltolinq.com/). Esto debería encargarse de la consulta en su pregunta. La otra herramienta es LinqPad (http://www.linqpad.net/). Esto te ayudará a aprender Linq mientras practicas las consultas.

A menudo uso Linqer para convertir una consulta T-SQL para mí, y luego uso LinqPad para ajustarla.

+0

Gracias! Ya tengo LinqPad, ahora conseguiré el 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

:(¡Escriba demasiado rápido! –

+0

FYI: Falta la expresión de selección en la consulta interna. – kbrimington

0

mismo ejemplo con LINQ sintaxis del método:

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:

estoy proporcionando esta respuesta, porque cuando buscaba la respuesta, no pude encontrar mucha respuesta que explica el mismo concepto en la sintaxis del método.

Por lo tanto, en el futuro, puede ser útil para las personas que buscan la sintaxis del método como yo hoy en día. Gracias karthik

+1

No creo que sea necesario, pero al menos podría hacerlo sintácticamente correcto –

+0

yup, agrego esto ahora, para aquellos que generalmente usan la sintaxis del método de linq .hope puede ser útil para ellos –

+0

Sí, pero el la conversión no es realmente ciencia de cohetes en este caso. Pero, de nuevo, la sintaxis no es correcta (minúsculas). –