Bien, aquí está la oferta: dataContext.Table1s
es del tipo IQueryable<T>
. IQueryable<T>
define Where
y Any
métodos que toman un predicado de tipo Expression<Func<T, bool>>
. El contenedor Expression<>
es fundamental, ya que esto es lo que permite a LINQ to SQL traducir su expresión lambda a SQL y ejecutarla en el servidor de la base de datos.
Sin embargo, IQueryable<T>
también incluye IEnumerable<T>
. IEnumerable<T>
también define Where
y Any
métodos, pero la versión IEnumerable toma un predicado de tipo Func<T, bool>
. Como esta es una función compilada y no una expresión, no se puede traducir a SQL. Como resultado, este código ...
Func<Table1, bool> lambda = x => x.Id > 1000;
var result = dataContext.Table1s.Where(lambda);
... tirará de cada registro de Table1s
en la memoria, y luego filtrar los registros en la memoria. Funciona, pero son realmente malas noticias si tu mesa es grande.
Func<Table1, bool> lambda = x => x.Id > 1000;
var result = dataContext.Table2s.Where(x => x.Table1s.Any(lambda));
Esta versión tiene dos expresiones lambda. El segundo, que se transfiere directamente al Where
, es un Expression
que incluye una referencia a Func
. No puede mezclar los dos, y el mensaje de error que está recibiendo le dice que la llamada al Any
está esperando un Expression
pero está pasando un Func
.
var result = dataContext.Table2s.Where(x => x.Table1s.Any(y => y.Id > 1000));
En esta versión, el lambda interno automáticamente se está convirtiendo en un Expression
porque esa es la única opción si desea que su código para ser transformado en SQL LINQ a SQL. En los otros casos, está forzando que la lambda sea Func
en lugar de Expression
, en este caso no, así que funciona.
¿Cuál es la solución? En realidad es bastante simple:
Expression<Func<Table1, bool>> lambda = x => x.Id > 1000;
Intenta usar 'var lamda = x => x.Id> 1000;'. No sé, ayudará, pero podría ... – Alxandr
@Alxandr - eso no es legal en realidad. Las expresiones de Lambda se pueden compilar a 'Func <>' o 'Expression>' y en su ejemplo el compilador no podrá decir cuál desea y arrojará un error. –