具有两个表的谓词构建器

在此处输入图像描述

Party可以拥有一个或多个Contact对象。

我想选择所有街道名称包含特定关键字的参与方。
如果我只想在派对中搜索,我可以使用下面的代码。 但是如何将其扩展到也在Contact中搜索?

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); } 

还有什么需要知道的吗?

编辑
我想我可以创建另一个谓词然后加入它们。 就像是:

 var predicate2 = PredicateBuilder.False(); 

……并且在foreach中:

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

但是如何在返回之前加入谓词和谓词2?

EDIT2
或者,在执行谓词生成器之前加入PartyContact

EDIT3
以下是生成的类的一部分:

 [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(); } } 

关键是你有一个聚会的多个联系人,因此,如果“任何联系人与街道名称匹配”或“所有联系人与街道名称匹配”,您应该决定是否要参加聚会。

对于第一种情况,它将是:

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

如果您的模型将Contact作为派对对象上的关联对象(并且如果它没有一对多关系),则此方法将起作用

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