generador de predicados con dos tablas

introduzca la descripción de la imagen aquí

Una fiesta puede tener uno o más objetos de contacto .

Quiero seleccionar todas las Partes cuyo nombre de calle contiene una palabra clave específica.
Si solo quiero buscar en Party , puedo usar el siguiente código. ¿Pero cómo lo extiendo para buscar también en Contacto ?

public IQueryable SearchParties(List keywords) { var predicate = PredicateBuilder.False(); foreach (string word in keywords) { var keyword = word; predicate = predicate.Or(p => p.surname.Contains(keyword)); predicate = predicate.Or(p => p.lastname.Contains(keyword)); predicate = predicate.Or(p => p.number.Contains(keyword)); } return db.Parties.Where(predicate); } 

¿Hay algo más que necesites saber?

EDITAR
Supongo que podría crear otro predicado y luego unirme a ellos. Algo como:

 var predicate2 = PredicateBuilder.False(); 

… y en el foreach:

 predicate2 = predicate2.Or(p => p.streetname.Contains(keyword)); 

Pero, ¿cómo uniría predicate y predicate2 antes de regresar?

EDIT2
¿O, únete a la Fiesta y al Contacto antes de hacer el generador de predicados?

EDITAR3
Aquí hay partes de las clases generadas:

 [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Contact")] public partial class Contact : INotifyPropertyChanging, INotifyPropertyChanged { private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty); private int _id; // ...more properties private EntityRef _Party; public Contact() { this._Party = default(EntityRef); OnCreated(); } } 

El punto es que tiene múltiples Contactos para una sola Parte, por lo tanto, debe decidir si desea tener una Parte si “cualquiera de los Contactos coincide con el nombre de la calle” o “todos los Contactos coinciden con el nombre de la calle”.

Para el primer caso sería:

 predicate = predicate.Or(p => p.Contacts.Any(c => c.streetname.Contains(keyword)))); 

Esto funcionará si su modelo tiene Contacto como objeto asociado en el objeto de la fiesta (y si no tiene una relación de uno a varios)

 predicate = predicate.Or(p => p.Contact.streetname.Contains(keyword));