6

Tengo problemas para consultar relaciones de muchos a muchos en Linq To Entities. básicamente estoy tratando de replicar esta consulta utilizando LINQ:Entity Framework - Linq To Entities - Many-To-Many Query Problems

Select * 
FROM Customer 
LEFT JOIN CustomerInterest ON Customer.CustomerID = CustomerInterest.CustomerID 
LEFT JOIN Interest ON CustomerInterest.InterestID = Interest.InterestID 
WHERE Interest.InterestName = 'Football' 

He mirado alrededor de la red y realmente no se encuentra ningún ejemplo adecuado de cómo hacer esto. El más cercano que tengo es:

List<Customer> _Customers = (from _LCustomers in _CRM.Customer.Include("CustomerInterest.Interest") 
            where _LCustomers.CustomerInterest.Any(x => x.Interest.InterestName == "Football") 
            select _LCustomers).ToList(); 

El problema con esto es que si un cliente tiene más de un interés y una de ellas es "El fútbol", entonces todos ellos son devueltos. También miré All() que tiene el problema inverso, es decir, solo volverá si tienen un interés y es el fútbol, ​​si tienen dos y uno de ellos no es fútbol, ​​nada se devuelve.

¿Alguien tiene alguna idea?

+0

favor, mire esta pregunta - http://stackoverflow.com/questions/1535443 y este post - http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip -37-cómo-hacer-a-condicional-incluir.aspx. – Kniganapolke

Respuesta

3

No estoy seguro de lo que quiere obtener. Una lista de clientes con un interés del cliente y un interés? Simplemente comience la consulta al interés del cliente.

context.CustomerInterest. 
    Where(ci => ci.Interest.InterestName == "Football"). 
    Select(ci => new 
    { 
     Customer = ci.Customer, 
     CustomerInterest = ci, 
     Interest = ci.Interest 
    }); 

Pero esto es muy redundante. ¿Por qué no solo obtener los intereses del cliente que coinciden?

IEnumerable<CustomerInterest> customerInterests = context.CustomerInterest. 
    Where(ci => ci.Interest.InterestName == "Football"); 

Todavía puede acceder a la otra información sin necesidad de almacenarla explícitamente.

foreach (CustomerInterest customerInterest in customerInterests) 
{ 
    DoSomething(customerInterest); 
    DoSomething(customerInterest.Customer); 
    DoSomething(customerInterest.Interest); 
} 
+0

Bueno, la idea es devolver a un cliente todos los datos relacionados usando al cliente como base de la consulta con un solo hit de db. Los datos devueltos serán serializados y devueltos al cliente (para una pantalla de mantenimiento del cliente) en una sola llamada wcf. Como intentamos mantener al cliente delgado y lo más genérico posible, el cliente no tiene ningún concepto de las entidades en el edmx, simplemente trabaja con el xml deserializado y trabaja con eso. Estoy tratando de evitar los tipos anónimos y devolver un objeto Cliente con solo los datos relacionados que coincidan con la cláusula where. –

1

Si intenta mantenerlo genérico, la mejor manera es ir con la entidad sql [Esql]. Coz L2E no admite dónde para las colecciones en la consulta de linq.

No puede utilizar

customer.Interests.Where ('fútbol' de interés => interest.Name ==)

La consulta se vería así ..

context.CreateQuery(@"SELECT VALUE Customer FROM Customer WHERE EXISTS(SELECT VALUE FROM CustomerInterest WHERE CustomerInterest.Ineterest.Name = 'FootBall')).Include("Interest");

¡Espero eso ayude!

+0

No caer a esql para soluciones simplemente parece un hackeo? Pierdes todo tu intellisense y casi todo lo que se suponía que era el punto de usar EF. También podría ejecutarlo en un DbReader en ese punto. –

+0

Sí ... pero obtiene un Cliente de entidad tipeado en EF en comparación con los Registros de datos devueltos por DbReader en ADO. –

0

Eso es mucho para LINQT. Intenta usar una vista en tu base de datos o trabaja como dijo Deepak N. Mejor

7

Prueba de esto,

var result = from c in ctx.Customer 
      from i in c.Interest 
      where i.InterestName == "Football" 
      select c; 

Espero que esto ayude,

Ray.

2
 var results = from c in _CRM.Customer 
         from ci in c.Interests 
         join i in _CRM.Interests 
         on ci.ID equals i.ID 
         where i.Interest = "Football" 
         select c; 
Cuestiones relacionadas