gpt4 book ai didi

c# - 我需要帮助加快此 EF LINQ 查询

转载 作者:行者123 更新时间:2023-11-30 17:46:36 25 4
gpt4 key购买 nike

我正在使用 EntityFramework 6 并遇到了一些主要的速度问题——这个查询需要两秒多的时间才能运行。为了加快查询速度,我花了一天中的大部分时间使用 LinqPad,但我只能将查询时间从 4 秒缩短到 2 秒。我尝试过分组、连接等,但生成的 SQL 对我来说看起来过于复杂。我猜我只是采用了错误的方法来编写 LINQ。

这是我正在尝试做的事情

  1. 查找所有 A,其中 Valid 为空且 AccountId 不是当前用户
  2. 确保 BCollection 不包含任何 B,其中 AccountId 是当前用户<
  3. 根据其集合中B的数量降序生成A
  4. 没有任何 B 的任何 A 都应该在返回结果的末尾。

我必须要像这样的模型:

public class A
{
public int Id { get; set; }
public bool? Valid { get; set; }
public string AccountId { get; set; }
public virtual ICollection<B> Collection { get; set; }
}

public class B
{
public int Id { get; set; }
public bool Valid { get; set; }
public string AccountId { get; set; }
public DateTime CreatedDate { get; set; }
public virtual A Property { get; set; }
}

A 的表有大约一百万行,B 最终会有大约一千万行。现在 B 是 50,000。

这是查询当前的样子。它给了我预期的结果,但我必须多次运行 orderby 并执行其他不必要的步骤:

var filterA = this.context.A.Where(gt => gt.Valid == null && !gt.AccountId.Contains(account.Id));

var joinedQuery = from b in this.context.B.Where(gv => !gv.AccountId.Contains(account.Id))
join a in filterA on gv.A equals a
where !a.Collection.Any(v => v.AccountId.Contains(account.Id))
let count = gt.Collection.Count()
orderby count descending
select new { A = gt, Count = count };

IQueryable<GifTag> output = joinedQuery
.Where(t => t.A != null)
.Select(t => t.A)
.Distinct()
.Take(20)
.OrderBy(t => t.Collection.Count);

谢谢

最佳答案

好吧,您总是可以尝试从 joinQuery 中删除这两行

其中 !a.Collection.Any(v => v.AccountId.Contains(account.Id))

降序排序

第一行已经在第一个Query中过滤了和 orderline,我们会在最后一个 Query 上进行排序,所以没有必要重复两次

关于c# - 我需要帮助加快此 EF LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26009379/

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