实体框架对象列表包含对象lambda的列表

时间:2016-01-16 13:46:47

标签: c# entity-framework lambda

以下情景:

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();

但是我收到了错误

  

此上下文仅支持原始类型或枚举类型。

2 个答案:

答案 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();