EntityFrameworkCore.Sqlite - 如何查询包含给定列表所有项目的子列表的实体?
EntityFrameworkCore.Sqlite - How to query entities with child list containing all items of given list?
给出以下模型
public class ApiImageModel
{
public int ID { get; set; }
...
public List<TagModel> Tags { get; set; } = new();
}
和
public class TagModel
{
public int ID { get; set; }
...
public string Name { get; set; }
public List<ApiImageModel> Images { get; set; } = new();
}
如何使用 Linq 查询基于一组给定 TagModel 的 ApiImageModel 列表?
我为此苦苦挣扎了一段时间,我当然遗漏了一些基本的东西,但我无法确定它。
我为 EF6 尝试了这种方法:
像这样,将所有 TagModel-ID 保存在数组“tagIDs”中:
int[] tagIDs;
...
IQueryable<ApiImageModel> images = context.Images.Where(image => tagIDs.All(id => image.Tags.Any(tag => tag.ID == id)));
但是 visual studio 奖励我一个“InvalidOperationException”:
The LINQ expression 'DbSet<ApiImageModel>()
.Where(a => __tagIDs_0
.All(id => DbSet<Dictionary<string, object>>("ApiImageModelTagModel")
.Where(a0 => EF.Property<Nullable<int>>(a, "ID") != null && object.Equals(
objA: (object)EF.Property<Nullable<int>>(a, "ID"),
objB: (object)EF.Property<Nullable<int>>(a0, "ImagesID")))
.Join(
inner: DbSet<TagModel>(),
outerKeySelector: a0 => EF.Property<Nullable<int>>(a0, "TagsID"),
innerKeySelector: t => EF.Property<Nullable<int>>(t, "ID"),
resultSelector: (a0, t) => new TransparentIdentifier<Dictionary<string, object>, TagModel>(
Outer = a0,
Inner = t
))
.Any(ti => ti.Inner.ID == id)))' could not be translated.
我很乐意提供一些帮助:)
假设您的标签 tagIDs
是唯一的,您可以执行以下操作:
int[] tagIDs;
var tagCount = tagIDs.Length;
...
var images = context.Images
.Where(image => image.Tags.Where(tag => tagIDs.Contains(tag.ID)).Count() == tagCount);
这里我们使用 Contains
来抓取我们感兴趣的标签,如果它们的 Count()
等于 tagIDs.Length
- 所有标签都存在于图像的标签关系中。
给出以下模型
public class ApiImageModel
{
public int ID { get; set; }
...
public List<TagModel> Tags { get; set; } = new();
}
和
public class TagModel
{
public int ID { get; set; }
...
public string Name { get; set; }
public List<ApiImageModel> Images { get; set; } = new();
}
如何使用 Linq 查询基于一组给定 TagModel 的 ApiImageModel 列表? 我为此苦苦挣扎了一段时间,我当然遗漏了一些基本的东西,但我无法确定它。
我为 EF6 尝试了这种方法:
像这样,将所有 TagModel-ID 保存在数组“tagIDs”中:
int[] tagIDs;
...
IQueryable<ApiImageModel> images = context.Images.Where(image => tagIDs.All(id => image.Tags.Any(tag => tag.ID == id)));
但是 visual studio 奖励我一个“InvalidOperationException”:
The LINQ expression 'DbSet<ApiImageModel>()
.Where(a => __tagIDs_0
.All(id => DbSet<Dictionary<string, object>>("ApiImageModelTagModel")
.Where(a0 => EF.Property<Nullable<int>>(a, "ID") != null && object.Equals(
objA: (object)EF.Property<Nullable<int>>(a, "ID"),
objB: (object)EF.Property<Nullable<int>>(a0, "ImagesID")))
.Join(
inner: DbSet<TagModel>(),
outerKeySelector: a0 => EF.Property<Nullable<int>>(a0, "TagsID"),
innerKeySelector: t => EF.Property<Nullable<int>>(t, "ID"),
resultSelector: (a0, t) => new TransparentIdentifier<Dictionary<string, object>, TagModel>(
Outer = a0,
Inner = t
))
.Any(ti => ti.Inner.ID == id)))' could not be translated.
我很乐意提供一些帮助:)
假设您的标签 tagIDs
是唯一的,您可以执行以下操作:
int[] tagIDs;
var tagCount = tagIDs.Length;
...
var images = context.Images
.Where(image => image.Tags.Where(tag => tagIDs.Contains(tag.ID)).Count() == tagCount);
这里我们使用 Contains
来抓取我们感兴趣的标签,如果它们的 Count()
等于 tagIDs.Length
- 所有标签都存在于图像的标签关系中。