2016-01-16 4 views
2

следующий сценарий:Entity Framework список объектов содержит список объектов лямбда

public class User{ 
    public virtual ICollection<MediaItem> MediaItems { get; set; } 
} 

public enum eMediaItemGenre 
{ 
    [Display(Name = "Pop")] 
    POP = 0, 
    [Display(Name = "Other")] 
    OTHER = 11 
} 

public class MediaItem 
{ 
    public virtual ICollection<MediaItemGenre> Genres { get; set; } 
} 

public class MediaItemGenre 
{ 
    [Key] 
    public Int32 Id { get; set; } 

    public eMediaItemGenre Genre { get; set; } 

    public Int32 MediaItemId { get; set; } 

    public virtual MediaItem MediaItem { get; set; } 
} 

Теперь я хотел бы сделать следующее: у меня есть MediaItem, и я хотел бы найти MediaItems, которые разделяют один и тот же Genre.

Я сделал это так:

List<MediaItem> lItems = ltCOntext.MediaItems.Where(x => x.Genres.Any(y => pGenres.Contains(y))).ToList(); 

, но я получаю ошибку

Только примитивные типы или типы перечисления поддерживаются в этом контексте.

+0

Почему у вас нет первичного ключа в 'MediaItem' и' User'? –

+0

я. Я просто удалил все свойства здесь, поэтому код не будет слишком длинным., –

ответ

2

Проблема заключается в том, что вы пытаетесь сравнивать сложные типы в базе данных со списком сложных типов в памяти, это не представляется возможным. То, что я предлагаю делать это преобразование вашего pGenres в список int с помощью проекции:

List<int> pGenresId = pGenres.Select(p => p.Id).ToList(); 

Затем вы можете использовать запрос:

List<MediaItem> lItems = ltCOntext.MediaItems 
     .Where(x => x.Genres.Select(g => g.Id).Any(y => pGenresId.Contains(y))).ToList(); 

Теперь Linq к сущности могут преобразовать это в запросе помещая int в Id в запросах.

+0

Не совсем то, что мне было нужно, но это то, что дошло до меня. –

1

А если попробовать этот вариант:

ICollection<MediaItemGenre> pGenres = mediaItem.Genres; 

List<MediaItem> lItems = 
       ltCOntext.MediaItems 
          .Where(m => m.Genres 
             .Any(g => 
              mediaItem.Genres 
              .Select(c=>c.Id).Contains(g.Id))).ToList();