具有两个表的谓词构建器

| 一方可以具有一个或多个联系人对象。 我想选择街道名称包含特定关键字的所有参与方。 如果我只想在Party中搜索,可以使用下面的代码。但是,如何将其扩展为也可以在“联系人”中搜索?
public IQueryable<Party> SearchParties(List<string> keywords)
    {
        var predicate = PredicateBuilder.False<Party>();

        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<Contact>();  
...并且在foreach中:
predicate2 = predicate2.Or(p => p.streetname.Contains(keyword));  
但是在返回之前,我将如何加入谓词和谓词2? 编辑2 或者,在创建谓词构建器之前加入“聚会和联系人”? 编辑3 这是生成的类的一部分:
[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> _Party;

    public Contact()
    {
    this._Party = default(EntityRef<Party>);
    OnCreated();
    }
}
    
已邀请:
        关键是您有一个联系人的多个联系人,因此,如果“任何联系人都与街道名称匹配”或“所有联系人都与街道名称匹配”,您应该决定是否要拥有一个聚会。 对于第一种情况,它将是:
predicate = predicate.Or(p => p.Contacts.Any(c => c.streetname.Contains(keyword))));
    
        如果您的模型将“联系人”作为关联方对象上的关联对象(并且它没有一对多关系),则此方法将起作用
predicate = predicate.Or(p => p.Contact.streetname.Contains(keyword));
    

要回复问题请先登录注册