我有以下实体框架linq查询,它为不同的客户ID执行了数百次,并可能返回数百个项目:
var events = Context.Events.AsNoTracking().Where(l => l.CustomerID == customerId &&
l.DateTime >= startDate && l.DateTime <= endDate &&
l.EventType != "SomeType" && l.Category.Contains("someString")
.OrderBy(l => l.DateTime).ThenBy(l => l.ProductId).ToList();
我一直在考虑这个查询的性能,并想知道在查询中先前添加ToList是否会提高性能。我尝试了以下内容,看到速度提高了20%,但我不确定这是否是偶然的:
var events = Context.Events.AsNoTracking().Where(l => l.CustomerID == customerId)
.ToList().Where(
l.DateTime >= startDate && l.DateTime <= endDate &&
l.EventType != "SomeType" && l.Category.Contains("someString")
.OrderBy(l => l.DateTime).ThenBy(l => l.ProductId).ToList();
我认为这是因为ToList将具有相关客户ID的所有事件带入内存,然后其余的过滤和排序在C#中而不是在SQL中发生在内存中。
这让我想到,在内存列表中的C#中执行哪些操作比在linqToSQL中更快?
我听说过字符串的contains(),而且SQL中的orderBy很慢,C#中内存列表的速度是否更快?
是否有指导我应该在内存中执行哪些操作以及我应该在SQL中执行哪些操作?