В моей базе данных есть следующие таблицы:
Между 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)));