我正在使用EntityFramework 6,但遇到了一些严重的速度问题-- 这个查询要运行超过两秒钟。我花了一整天的时间使用LinqPad来加快查询速度,但我只能将其从4秒减少到2秒。我尝试了分组、连接等,但是生成的SQL对我来说看起来过于复杂。我猜想我可能只是在编写LINQ时采取了错误的方法。
以下是我的尝试:
1.查找所有Valid为null且AccountId不是当前用户的A对象。
2.确保B集合中不包含AccountId为当前用户的任何B对象。
3.按其集合中的B数量降序排序所得到的A对象。
4.任何没有B对象的A对象应该在返回结果的末尾。
我的模型如下:
以下是我的尝试:
1.查找所有Valid为null且AccountId不是当前用户的A对象。
2.确保B集合中不包含AccountId为当前用户的任何B对象。
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; }
}
< p >表A
有大约一百万行,而B
最终将拥有约一千万行。目前B
只有50000行。< /p>
< p >以下是当前查询的样子。虽然它给出了预期的结果,但我必须多次运行orderby
和其他不必要的步骤:< /p>
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);
谢谢