0

在我们基于 .NET 4.6 的后端应用程序中,我们使用了大量的 Linq To Sql 编译查询。使用 dotMemory 分析我的应用程序时,我注意到其中一些引用了最初编译查询时使用的(现已处理的)DataContext。这个参考似乎永远不会消失。

查询本身并不复杂。这是一个例子:

private static readonly Func<DataContext, int, IQueryable<bool>> _IsEditingAllowed_Anmeldung_CompiledQuery =
  CompiledQuery.Compile((DataContext db, int id) =>
      db.GetTable<PersonenAnmeldung>()
        .Where(p => p.Id1 == id)
        .Select(p => p.Status.AllowEdit));

这种查询的最短路径如下:

DataContext的保留路径

Static reference: StatusLogic._IsEditingAllowed_Anmeldung_CompiledQuery ->
Func<DataContext, Int32, IQueryable<Boolean>>._target ->
CompiledQuery.compiled ->
SqlProvider+CompiledQuery.queryInfos ->
SqlProvider+QueryInfo[1] at [0] ->
SqlProvider+QueryInfo.query ->
SqlSelect.selection ->
SqlColumnRef.sourceExpression ->
MethodCallExpressionN._arguments ->
TrueReadOnlyCollection<Expression>.list ->
Expression[2] at [0] ->
LinkedTableExpression.table ->
Table<Status>.context ->
DataContext

我的问题是,有没有已知的方法来规避这个问题?除了用未使用的数据上下文填充内存之外,这根本不是问题吗?

4

0 回答 0