Недавно я превратил функцию LINQ-2-SQL в скомпилированный запрос, и я заметил несколько странное поведение с ним. Когда я сохраняю его как статическое поле, согласно каждому примеру, который я видел здесь и в остальной части сети, нагрузочное тестирование привязывает ЦП к 100% на все время теста. С другой стороны, когда я делаю это как статическое свойство, точно такой же сценарий нагрузочного тестирования колеблется в диапазоне 40-100%. Почему производительность намного лучше, чем собственность? У кого-нибудь есть идея? Насколько я могу судить, единственное различие между ними состоит в том, что поле занимает больше процессора, чем свойство.
Вот две версии:
private static Func<WebDataContext, int, int, IEnumerable<Product>> GetProductsWithDecendentQuery
{
get
{
return CompiledQuery.Compile<WebDataContext, int, int, IEnumerable<Product>>((WebDataContext context, int left, int right) =>
context.Taxonomies.Where(x => x.LeftNumber >= left && x.RightNumber <= right)
.SelectMany(x => x.InventoryTaxonomies.Select(y => y.Product))
.Distinct().Where(x => x.Status && (x.IsDropShip != true || x.Locations.Sum(y => y.Quantity) > 1))
);
}
}
против
private static Func<WebDataContext, int, int, IEnumerable<Product>> GetProductsWithDecendentQuery =
CompiledQuery.Compile<WebDataContext, int, int, IEnumerable<Product>>((WebDataContext context, int left, int right) =>
context.Taxonomies.Where(x => x.LeftNumber >= left && x.RightNumber <= right)
.SelectMany(x => x.InventoryTaxonomies.Select(y => y.Product))
.Distinct().Where(x => x.Status && (x.IsDropShip != true || x.Locations.Sum(y => y.Quantity) > 1))
);