对象的实体框架列表包含对象 lambda 的列表
本文关键字:列表 对象 lambda 包含 框架 实体 | 更新日期: 2023-09-27 18:30:35
以下场景:
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();
但我收到错误
在此上下文中仅支持基元类型或枚举类型。
问题是您正在尝试将数据库中的复杂类型与内存中的复杂类型列表进行比较,这是不可能的。我建议做的是使用投影将您的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-entity可以通过将Id
的int
放入查询中来将其转换为查询。
如果你尝试这个变体:
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();