Ho due tabelle di database Contatto (Id, Nome, ...) e ContactOperationalPlaces (ContactId, MunicipalityId), dove un contatto può essere collegato a più ContactOperationalPlaces.Come aggiungere una clausola where su un join linq (lambda)?
Quello che sto cercando di fare è creare una query (ASP .NET, C#) con IQueryable, che seleziona solo tutti i contatti esistenti nella tabella ContactOperationalPlaces, con un determinato ID di dominio.
la query SQL simile alla seguente:
select * from Contacts c
right join ContactOperationPlaces cop on c.Id = cop.ContactId
where cop.MunicipalityId = 301;
Con LINQ sarebbe simile a questa:
//_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);
Quindi, so come fare questo se il punto è stato quello di selezionare tutti questo in una volta, sfortunatamente non lo è. Sto costruendo una query basata sull'input dell'utente, quindi non conosco tutta la selezione in una volta.
Quindi questo è ciò che il mio codice è simile:
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 differenza con i due in cui dichiarazioni è che con il primo, ogni contatto ha un solo nome, ma con quest'ultimo un contatto può contenere diversi posti operativi ...
Sono riuscito a trovare una soluzione, ma questa soluzione mi dà un oggetto non identificato, che contiene entrambi i tavoli. E non so come procedere.
query.Join(_ctx.ContactOperationPlaces, c => c.Id, cop => cop.ContactId,
(c, cop) => new {c, cop}).Where(o => o.cop.municipalityId == 301);
L'oggetto restituito da questa espressione è System.Linq.Iqueryable < {c: Contatto, cop: ContactOperationalPlace}>, e non può essere lanciato a Contatti ...
Così, che è il problema. La risposta è probabilmente piuttosto semplice, ma proprio non riesco a trovarla ...
e aggiungere distinte() per il contatto probabilmente –
Grazie per il correzione. –
Grazie mille! Sapevo che la soluzione sarebbe stata piuttosto semplice una volta trovata. – linnkb