построитель предикатов с двумя таблицами - PullRequest
3 голосов
/ 13 июня 2011

enter image description here

A Партия может иметь один или несколько Контактов объектов.

Я хочу выбрать все Стороны , чье название улицы содержит определенное ключевое слово.
Если я просто хочу искать в 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);
    }  

Что-нибудь еще нужно знать?

EDIT
Я думаю, я мог бы создать другой предикат, а затем присоединиться к ним. Что-то вроде:

var predicate2 = PredicateBuilder.False<Contact>();  

... и в foreach:

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

Но как мне присоединиться к предикату и предикату2 до возвращения?

EDIT2
Или присоединитесь к Party и Contact перед выполнением предиката Builder?

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

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

Дело в том, что у вас есть несколько контактов для одной стороны, поэтому вы должны решить, хотите ли вы иметь сторону, если «любой из контактов соответствует названию улицы» или «все контакты соответствуют названию улицы».

Для первого случая это будет:

predicate = predicate.Or(p => p.Contacts.Any(c => c.streetname.Contains(keyword))));
1 голос
/ 13 июня 2011

Это будет работать, если ваша модель имеет Контакт как связанный объект на объекте вечеринки (и если она не имеет отношения один ко многим)

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