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.

¿Fue útil?

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í:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top