Каков наиболее эффективный способ выполнения сравнений с участием многих-многих отношений с LINQ в EF 4.1?

В моей базе данных есть следующие таблицы:

  • Person
  • Post
  • InterestTag

Между Person-InterestTag и Post-InterestTag существуют отношения "много-много"

Мне нужно выполнить linq-запрос в EF 4.1, чтобы откатить любое сообщение, содержащее хотя бы один интересующий тег, соответствующий хотя бы одному интересующему тегу, связанному с данного пользователя.

Пример

У человека следующие интересы:

  • Автомобили
  • Спорт
  • Фитнес

Мне нужно вернуть все сообщения, связанные с автомобилями, спортом или фитнесом.

Каков наиболее эффективный способ написать этот запрос с точки зрения производительности?

Изменить

Возникла ошибка на основе ответа, приведенного ниже ...

Компилируется нормально, но выдает ошибку во время выполнения :

var matchingPosts = posts.Where(post => post.Topics.Any(postTopic =>   person.Interests.Contains(postTopic)));

Ошибка:

Unable to create a constant value of type 'System.Collections.Generic.ICollection`1'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

Есть идеи, как это исправить?

РЕДАКТИРОВАТЬ 2

Итак, мои классы структурированы следующим образом:

public class Person
{
    public int PersonID {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
    //other properties of types string, int, DateTime, etc.

    public ICollection<InterestTag> InterestTags {get; set;}      
}


public class Post
{
    public int PostID {get; set;}
    public string Title{get; set;}
    public string Content {get; set;}
    //other properties of types string, int, DateTime, etc.

    public ICollection<InterestTag> InterestTags {get; set;}


}

public class InterestTag
{
    public int InterestTagID { get; set; }
    public string InterestDescription { get; set; }
    public bool Active { get; set; }

    public ICollection<Person> Persons { get; set; }
    public ICollection<Post> Posts { get; set; }
}

В моем классе Context я переопределяю OnModelCreating, чтобы определить мою таблицу БД names

modelBuilder.Entity<Person>().HasMany(u => u.InterestTags).WithMany(t => t.Persons)
    .Map(m =>
    {
        m.MapLeftKey("PersonID");
        m.MapRightKey("InterestTagID");
        m.ToTable("PersonInterestTags");
    });

modelBuilder.Entity<Post>().HasMany(u => u.InterestTags).WithMany(t => t.Posts)
    .Map(m =>
    {
        m.MapLeftKey("PostID");
        m.MapRightKey("InterestTagID");
        m.ToTable("PostInterestTags");
    });

В моем методе запроса я возвращаю IQueryable of Post и применяю некоторые фильтры, включая предложение, которое я пытаюсь выполнить в этом вопросе.

 var person = personRepository.Get(x => x.PersonID = 5);
 var posts = postRepository.GetQueryable();

 //I have tried this and get the error above
 posts= posts.Where(x => x.InterestTags.Any(tag => person.InterestTags.Contains(tag)));
7
задан stephen776 20 October 2011 в 14:05
поделиться