3

在此处输入图像描述

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

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

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

但是在返回之前我将如何加入 predicate 和 predicate2 呢?

EDIT2或者,在做谓词生成器之前
加入派对联系人?

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> _Party;

    public Contact()
    {
    this._Party = default(EntityRef<Party>);
    OnCreated();
    }
}
4

2 回答 2

5

关键是你有多个联系人到一个派对,因此你应该决定是“任何联系人与街道名称匹配”还是“所有联系人与街道名称匹配”时是否要拥有一个派对。

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

predicate = predicate.Or(p => p.Contacts.Any(c => c.streetname.Contains(keyword))));
于 2011-06-28T12:19:05.967 回答
1

如果您的模型将联系人作为聚会对象上的关联对象(并且如果它没有一对多关系),这将起作用

predicate = predicate.Or(p => p.Contact.streetname.Contains(keyword));
于 2011-06-13T08:49:24.453 回答