以下情景:
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
的{{1}}。
我是这样做的:
List<MediaItem> lItems = ltCOntext.MediaItems.Where(x => x.Genres.Any(y => pGenres.Contains(y))).ToList();
但是我收到了错误
此上下文仅支持原始类型或枚举类型。
答案 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-to-entities可以通过在查询中放置int
的{{1}}来将其转换为查询。
答案 1 :(得分: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();