gpt4 book ai didi

c# - Linq 优化的相交查询

转载 作者:行者123 更新时间:2023-12-02 00:45:51 25 4
gpt4 key购买 nike

我有这样的结构:

public class Tag
{
public int TagId { get; set; }
public virtual ICollection<Vacancy> Vacancies { get; set; }
// ...
}

public class Vacancy
{
public int VacancyId { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
// ...
}

这些实体通过 EF/Code First 方法映射到 MS SQL。

之后,我以某种方式从上下文(基于用户查询)获取标签列表:

List<Tag> userSelectedTags = ...;

我想选择包含所有(!)这些标签的所有职位空缺,例如:

List<Vacancy> vacancies = context.Where(v => v.Tags.Intersect(userSelectedTags)).ToList();

但是!问题是我可能有大量数据。 AFAIK Intersect 并不是最好的方法,因为它会选择每个空缺的所有标签,然后对它们执行 Intersect。我不想给 SQL Server 加载太多,而且我绝对可以为此编写纯 sql 查询。但我想知道 LINQ 是否可以帮我做到这一点?有没有更温和的方法?

最佳答案

Arkiliknam 的解决方案非常有效,也许是最有效的解决方案,但它也存在一些问题。我开始在评论中指出它们,以便改进答案,但这效果不佳。这是 Arkiliknam v. 2.0:

var result = context.Vacancies; // IQueryable!
var tags = userSelectedTags.Select(t => t.TagId);

foreach(int i in tags)
{
int j = i; // prevent modified closure.
result = result.Where(v => v.Tags.Select(t => t.TagId).Contains(j));
}
result.Select(r => ....

它会转换为带有 WHERE EXISTS 谓词链的查询(与选定的标签一样多)。

如果这效果不好,您可以尝试另一种方法:

var r = context.Vacancies
.Where(v => tags.All(i => v.Tags.Select(t => t.TagId).Contains(i)))
.Select (v => ....);

这表示对于所有选定的 TagId,每个 Id 都应位于 VacancyTagId 集合中。

关于c# - Linq 优化的相交查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com