3

ここに画像の説明を入力

Partyは、1 つ以上の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
または、述語 Builder を実行する前に 、 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> _Party;

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

2 に答える 2

5

ポイントは、1 つのパーティに対して複数の連絡先があることです。そのため、「いずれかの連絡先が通りの名前と一致する」か、「すべての連絡先が通りの名前と一致する」場合に、パーティーを作成するかを決定する必要があります。

最初のケースでは、次のようになります。

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