闽公网安备 35020302035485号

SELECT TOP (1) UserId, FirstName, LastName, EmailAddress FROM Users WHERE UserId = @param_1我们发现这样的多个查询:
SELECT TOP (1) UserId, FirstName, LastName, EmailAddress FROM Users WHERE UserId = 5因此,我们进行了一些搜索,寻找可能与之相关的EF核心问题,并遇到了这个问题:https[2] : //github.com/aspnet/EntityFrameworkCore/issues/10535[3]。
// Before
var param = Expressions.Expression.Parameter(typeof(T));
Expression = Expressions.Expression.Lambda<Func<T, bool>>(
Expressions.Expression.Call(
Expressions.Expression.Constant(valuesToFilter),
"Contains",
Type.EmptyTypes,
Expressions.Expression.Property(param, propertyName)),
param);
// After
var param = Expressions.Expression.Parameter(typeof(T));
// This is what we added
Expression<Func<List<int>>> valuesToFilterLambda = () => valuesToFilter;
Expression = Expressions.Expression.Lambda<Func<T, bool>>(
Expressions.Expression.Call(
valuesToFilterLambda.Body,
"Contains",
Type.EmptyTypes,
Expressions.Expression.Property(param, propertyName)),
param);
使用lambda表达式获取表达式主体会使Entity Framework Core[4]对SQL查询进行参数化,因此仅缓存它的一个实例。这是包括修订版本在内的一段时间内的内存使用情况。该版本以红色标记,您可以看到差异很大。稳定的内存使用量从未超过200MB,而不断攀升至超过1GB,然后发生崩溃。