.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
私の質問は、この問題を回避する既知の方法はありますか? 使用されていないデータコンテキストでメモリがいっぱいになる以外に、それはまったく問題ですか?