2008-12-15 59 views

Respuesta

7

Usted podría intentar:

var yIds = from y in dataContext.Y 
      where ... 
      select y.XId; 

var query = from x in dataContext.X 
      where yIds.Contains(x.Id) 
      select x; 

No sé si funcionará, aunque - ninguna razón por la que no quiere hacer sólo una unión en su lugar? Por ejemplo:

var query = from x in dataContext.X 
      join y in dataContext.Y.Where(...) on x.Id equals y.Xid 
      select x; 
+2

No tiene que ser un "alguien más es escribiendo exactamente la misma respuesta que tu "emergente de estado en este sitio :) –

+1

Razón para no unirse: si x es 1 a muchos con y, la unión dará x duplicados. –

+0

@DavidB: cierto. Me pregunto qué agregaría una llamada a Distinct() al final ... –

8

Para hacer una IN en sql, debe usar la función Contiene en Linq.

Así, por ejemplo:

var query = from x in GetX() 
      where (from y in GetY() select y.xID).Contains(x.xID) 
      select x; 

También podría definir la consulta LINQ interno por separado si se quiere, que es un poco más legible

+0

¿Qué significa esto para el rendimiento? ¿Habrá una diferencia en la definición de la consulta contra usarla en línea? – Dimse

+0

Sin diferencia en absoluto. –

5

que estaba buscando una solución NOT IN para LINQ a SQL. Gracias a esta pregunta yo era capaz google lo correcto y encontrar esta entrada del blog: The NOT IN clause in LINQ to SQL

C#

NorthwindDataContext dc = new NorthwindDataContext(); 
var query = 
    from c in dc.Customers 
    where !(from o in dc.Orders 
      select o.CustomerID) 
      .Contains(c.CustomerID) 
    select c; 

VB.net

Dim db As New NorthwinDataContext() 
Dim query = From c In dc.Customers _ 
      Where Not (From o in dc.Orders _ 
         Select o.CustomerID).Contains(c.CustomerID) _ 
      Select c 
+0

esta respuesta me ayudó mucho, ¡gracias! Tengo una configuración de clase donde una clase posee una Lista (De Clase2) de la cual cada una posee una Lista (De Clase3) (para imitar un contenedor, un bono de recepción de mercancías y mercancías que reciben líneas de comprobante en una instalación de depósito). Es necesario encontrar una forma de buscar una parte específica en Class3 mientras se inicia en Class1 sin For Each iterando a través de cada instancia de clase. Esto funciona muy bien (¡sin el No para mí)! – RianBattle

Cuestiones relacionadas