marco de la entidad (3,5): ¿Cómo traducir una determinada consulta LINQ a eSQL?
-
20-09-2019 - |
Pregunta
Tengo la siguiente consulta LINQ que tengo que traducir a Entity SQL / eSQL):
return (ObjectQuery<User>) from user in Users
where !user.Roles.Any(r => r.AnIntegerProperty < 0)
select user;
User.Roles es una propiedad de navegación a la n: m relación con Roles y también hay una propiedad Role.Users navegación al revés. No hay User_Roles o Entidades Roles_User disponibles en el modelo, y no puedo agregar éstos.
También no puede utilizar la declaración de LINQ aquí, porque tengo que añadir .OrderBy ( "él". + Propertyname) (viene de otra fuente, no puede cambiar eso también) posterior en que no es posible si el ObjectQuery es construir con LINQ.
Entonces, ¿cómo puedo traducir esto a eSQL? Y donde puedo encontrar buenas muestras esql? He buscado durante todo un día hasta ahora y tengo que admitir que la referencia eSQL es pésimo y no hay ningún ejemplo que pueden utilizarse en la web.
Solución
En caso de que no tiene hallazgo solución, esto funcionará
SELECT VALUE u FROM YourDataContextEntities.Users AS u WHERE NOT EXISTS(SELECT r FROM u.Roles AS r WHERE r.AnyIntegerProperty < 0)
Otros consejos
Creo que LINQ biblioteca dinámica puede ser la solución aquí:
Puede crear expresiones de filtrado que utilizan nombres de las propiedades dinámicas, así que no hay necesidad de hacer traducciones.
Me gustaría escribir algo así como
contexte.Users.Where("NOT EXISTS (SELECT VALUE r FROM it.Roles AS r WHERE r.AnIntegerProperty < 0)")
No se ha probado, pero ya he intentado algo similar por lo Thi debe trabajar para usted.
Es difícil encontrar una respuesta sin conocer los detalles de lo que está disponible en Usuarios y funciones. Sin embargo, teniendo en cuenta lo que ha dicho, será el siguiente trabajo:
return (ObjectQuery<User>) from user in Users
where !(from role in dataContext.Roles
where role.AnIntegerProperty < 0
select role.UserId).Contains(user.UserId);