2012-06-21 8 views
5

Tengo dos tablas Service y Provider. Entre ellos hay una tabla de unión ServiceProvider que tiene solo 2 campos, uno para cada una de las dos PK. Cuando se agrega a edmx, la tabla join many-to-many se abstrae y no se puede ver (como se esperaba).Muchos a muchos seleccionar en LINQ a Entidades

Todo está bien, excepto cuando deseo obtener proveedores basados ​​en un servicio determinado. A partir de este question:

parece que la respuesta sería simplemente:

var query = from p in entities.Providers 
      from s in entities.Services 
      where s.Id == 15 
      select p; 

pero esto devuelve todos los proveedores. ¿Qué estoy haciendo mal aquí?

+0

¿El 'S 'no tienen una propiedad' prestadoras de esos servicios puede utilizar? – Rawling

+0

Sí s.Providers es una colección de Proveedores, pero tampoco pude conseguir que funcione como parte de la selección. – finoutlook

+0

@abatishchev: gracias por las ediciones, pero no cambiar el título, ¿la pregunta será más difícil de encontrar si alguien busca el marco de entidades de muchas a muchas? (Me doy cuenta de que su EF está definida por la etiqueta, pero se realizará una búsqueda sobre eso) – finoutlook

Respuesta

4
var query = entities.Providers.FirstOrDefault(p => p.Id == 15).Services.ToList(); 
+0

Creo que tiene sus "Proveedores" y "Servicios" al revés. – Rawling

+0

Sí, fueron los proveedores que estaba tratando de dar salida, pero veo que es simétrico de todos modos – finoutlook

+0

Sí, creo que el principio funciona en ambos sentidos. – Rawling

-1

Usted puede tratar de usar join, así:

entity.Providers.Join(entity.Services, c => c.ID, p => p.ID,(c, p) => new { Providers= c, Services= p }) 
+0

¿Por qué la ID del proveedor debe ser igual a la ID del servicio? ¿Por qué está seleccionando un par {Proveedores, Servicios} cuando fin solo quiere una lista de proveedores? – Rawling

+0

simplemente proponiéndole una forma que él pudiera entender. Él puede establecer más tarde y eliminar lo que no necesita – Boomer

+0

¿Entonces podría eliminar la declaración 'Join'? – Rawling

2

Prueba esto:

var res = from s in entities.Services 
      where s.Id == 15 
      select s.Provider; 

EDITAR

corregido y puesto a prueba la consulta en el modelo de la vida real y datos. Ahora funciona.

+0

Eso no va a funcionar en una relación de muchos a muchos, ya que los tipos de colección generalmente no tienen una propiedad 'Id'. – Nuffin

+0

corrigió la respuesta. –

2

¿No es tan simple como

var matchingProviders = entities.Services.Single(s=>s.Id==15).Providers; 
+0

Esto funciona. Todavía estoy confundido sobre por qué la otra pregunta que mencioné tiene votaciones ascendentes, y esta publicación tiene la misma sugerencia de "doble de": http://smehrozalam.wordpress.com/2010/06/29/entity-framework-queries-involving- many-to-many-relationship-tables/ – finoutlook

+0

@Downvoter: ¿Le importa comentar? – Rawling

+0

@finoutlook No estoy muy familiarizado con el marco de entidades, pero si esto funciona, y no parece demasiado descabellado para que funcione, entonces funciona :) – Rawling

Cuestiones relacionadas