Tengo dos tablas de base de datos Contacto (Id, Nombre, ...) y ContactOperationalPlaces (ContactId, MunicipalityId), donde un contacto se puede conectar a varios ContactOperationalPlaces.Cómo agregar una cláusula where en una unión linq (lambda)?
Lo que intento hacer es crear una consulta (ASP .NET, C#) con IQueryable, que solo selecciona todos los contactos que existen en la tabla ContactOperationalPlaces, con un MunicipalityId dado.
la consulta SQL tiene este aspecto:
select * from Contacts c
right join ContactOperationPlaces cop on c.Id = cop.ContactId
where cop.MunicipalityId = 301;
Con LINQ se vería algo como esto:
//_ctx is the context
var tmp = (from c in _ctx.Contacts
join cop in _ctx.ContactOperationPlaces on c.Id equals cop.ContactId
where cop.MunicipalityId == 301
select c);
lo tanto, sé cómo hacer esto si el punto era seleccionar todos esto de una vez, desafortunadamente no lo es. Estoy construyendo una consulta basada en la entrada del usuario, por lo que no sé toda la selección a la vez.
Así que esto es lo que se ve mi código como:
IQueryable<Contacts> query = (from c in _ctx.Contacts select c);
//Some other logic....
/*Gets a partial name (string nameStr), and filters the contacts
so that only those with a match on names are selected*/
query = query.Where(c => c.Name.Contains(nameStr);
//Some more logic
//Gets the municipalityId and wants to filter on it! :(how to?
query = query.where(c => c.ContactOperationalPlaces ...........?);
La diferencia con los dos cuando las declaraciones es que con la primera, cada contacto tiene un solo nombre, pero con este último un contacto puede contener varios lugares operativos ...
He logrado encontrar una solución, pero esta solución me da un objeto no identificado, que contiene las dos tablas. Y no sé cómo proceder con eso.
query.Join(_ctx.ContactOperationPlaces, c => c.Id, cop => cop.ContactId,
(c, cop) => new {c, cop}).Where(o => o.cop.municipalityId == 301);
El objeto devuelto por esta expresión es System.Linq.Iqueryable < {c: Contacto, CP: ContactOperationalPlace}>, y no se puede convertir a Contactos ...
Entonces, eso es la cuestión. La respuesta es probablemente bastante simple, pero no puedo encontrarlo ...
y probablemente un signo profundo() para el contacto –
Gracias por la corrección. –
¡Muchas gracias! Sabía que la solución sería bastante simple una vez que la encontrara. – linnkb