Проблема написания предикатов для поиска в хранилище с Entity Framework (эквивалентно использованию Join в SQL) - PullRequest
1 голос
/ 29 ноября 2011

Мы используем код Entity Framework 4.1 для сохранения данных. Некоторые из наших организаций имеют такие отношения:

[Serializable]
public class Conference
{
    private IList<Attendee> people;
    private string name;        

    public IList<Attendee> People
    {
        get { return this.team; }
        private set { this.team = value; }
    }

    public string Name
    {
        get { return this.name; }
        private set { this.name = value; }
    }
}

[Serializable]
public class Attendee
{
    private string firstname;
    private string surname;

    public string Firstname
    {
        get { return this.firstname; }
        private set { this.firstname = value; }
    }

    public string Surname
    {
        get { return this.surname; }
        private set { this.surname = value; }
    }
}

Я бы хотел запросить наш репозиторий конференций, используя LINQ. Я могу легко найти конференцию по названию, используя поисковую спецификацию, подобную этой:

public class ConferenceNameSearch : ISpecification<Conference>
{
    public Expression<Func<Conference, bool>> IsSatisfied()
    {
        return a => a.Name == "Christmas Party";
    }
}

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

public class ConferenceAttendeeNameSearch : ISpecification<Conference>
{
    public Expression<Func<Conference, bool>> IsSatisfied()
    {
        return a => a.People.Contains( ???? err "David";
    }
}

Есть ли способ сделать это? Кроме того, подняв его еще на один уровень сложности, если бы вместо простого поиска конференций с участником по имени «Дэвид» у меня был список имен, которым я хотел бы соответствовать, было бы это тоже возможно?

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

Похоже, что вы хотите IEnumerable<T>.Any:

public class ConferenceAttendeeNameSearch : ISpecification<Conference>
{
    public Expression<Func<Conference, bool>> IsSatisfied()
    {
        return a => a.People.Any(p => p.FirstName.Equals("David"));
    }
}

Any возвращает логическое значение, указывающее, соответствует ли какой-либо из элементов последовательности условию. Вы можете описать его поведение как sequence.Where(condition).Count() > 0.

Связанный с вами метод, о котором вам следует знать (хотя он и здесь не применим): IEnumerable<T>.All.

1 голос
/ 29 ноября 2011

Попробуйте это:

public class ConferenceAttendeeNameSearch : ISpecification<Conference>
{
    public Expression<Func<Conference, bool>> IsSatisfied()
    {
        return a => a.People.Where(p => p.FirstName.Equals("David"));
    }
}
...