2011-03-14 60 views
5

¿Cómo puedo convertir la siguiente consulta para una expresión lambdaconsulta SQL a la expresión lambda o LINQ

select * 
from Invoice_main 
where id not in 
    (select invoice_main_id from Invoice_payment_by_pay_method) 

no pude encontrar una alternativa para los 'no'.

Respuesta

2

Asumiendo que están utilizando LINQ a SQL:!.

from inv in Invoice_main 
where !(from m in Invoice_payment_by_pay_method select m.invoice_main_id).Contains(inv.id) 
select inv 

El (...) Contiene (...) se convierte automáticamente por LINQ a SQL para una cláusula NOT EXISTS (nota : esto es más eficiente que la cláusula NOT IN).

Otros proveedores (es decir, no LINQ to SQL) no puede apoyar esta reescritura de .Contains en EXISTS por lo que este puede no funcionar para todo.

+0

Hola, estoy usando entitydatamodel. No sé mucho sobre entitydatamodel y linq to sql. Pero creo que linq to sql no funcionará en entitydatamodel. cuando uso la consulta sugerida, da un error. es como: "No se pudo encontrar una implementación del patrón de consulta ..." – Mukesh

+0

Disculpa por el comentario anterior. Esta funcionando. – Mukesh

+0

Entonces está usando Entity Framework. LINQ-to-Entities es mucho más restrictivo que LINQ-to-SQL (mi propia opinión). No tienes un equivalente con LINQ-to-Entities. Tendrá que tener dos consultas de LINQ-a-Entidades, una para seleccionar ID de pay_method, la otra usando una cláusula 'Any' para excluir las ID de la primera consulta. –

Cuestiones relacionadas