gpt4 book ai didi

c# - 一些查询后 Entity Framework 变慢

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:24 25 4
gpt4 key购买 nike

我有一个代码:

foreach (var idObject in ids)
{
var parsedIDs = ParseId(idObject.id);

var integers = new Dictionary<string, int>() { { "model_id", model }, { "year", 2010 }, { "quarter", 1 }, { "month", 1 }, { "rows", rows }, { "page", page } };
var strings = new Dictionary<string, string>() { { "gr_str", "" }, { "row_id", "" }, { "sidx", sidx }, { "sord", sord } };
var additionals = new Dictionary<string, object>() { { "rowid", idObject.id },
{"contr_group_id_e", parsedIDs[0]},
{"nomencl_group_set1_id_e", parsedIDs[1]},
{"nomencl_group_set2_id_e", parsedIDs[2]},
{"workshop_id_e", parsedIDs[3]},
{"unit_meas_id_e", parsedIDs[4]},
{"plant_id_e", parsedIDs[5]} };

foreach (var datePair in queryDates)
{
additionals["begin_date_e"] = datePair.Key;
additionals["end_date_e"] = datePair.Value;

var parameters = InitParams(integers, strings, additionals).ToArray();

var lastTimestamp = DateTime.Now;

var queryResults = ModelEntities.ExecuteStoreQuery<ReadyProductIndexes>(Queries.SaleIndexGetRowByID, "Sale", MergeOption.NoTracking, parameters).ToList();

Debug.WriteLine("TIme: " + (DateTime.Now - lastTimestamp).TotalSeconds);
}

Debug.WriteLine("rowid " + idObject.id);
}

有一个问题 - 在第一个 foreach 步骤一切正常,但在第二个和其他查询开始工作非常慢(例如第一步 0.2 秒,第二个 8 秒).

我的代码有什么问题?

编辑:我已经尝试使用 MS SQL 探查器,并且有一些有趣的事情 - 探查器显示 8 秒的请求持续时间,但是当我尝试从探查器手动运行请求时,它运行快速地。这很奇怪。

最佳答案

我认为这里的问题很常见,因为您的 EF 上下文增长了查询所需的时间成倍增加。这是因为检测更改(在大多数 EF 操作上运行)会枚举 EF 当前跟踪的每个对象。这意味着如果您要跟踪数千个实体,可能会花费相当多的时间。从您的代码示例中很难判断这个问题出在哪里,但它非常适合该模式。我建议查看 DbSet 上的 .Local 集合,以确认跟踪了很多项。

我写了几篇你可以阅读的文章 herehere .

所有这一切的结果是您想要减少 EF 正在跟踪的内容(通过使用 .AsNoTracking 或通过调用 detect changes less)并且您的查询应该既好又快。

关于c# - 一些查询后 Entity Framework 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13931307/

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