Skip to content

Commit

Permalink
Merge pull request #218 from linq2db/issue/217
Browse files Browse the repository at this point in the history
Fixed unexpected extension evaluation.
  • Loading branch information
sdanyliv authored Apr 7, 2022
2 parents 8a63535 + a8ceb18 commit c34191a
Showing 1 changed file with 23 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -767,12 +767,24 @@ public virtual Expression TransformExpression(Expression expression, IDataContex
var tracking = true;
var ignoreTracking = false;

var nonEvaluatableParameters = new HashSet<ParameterExpression>();

TransformInfo LocalTransform(Expression e)
{
e = CompactExpression(e);

switch (e.NodeType)
{
case ExpressionType.Lambda:
{
foreach (var parameter in ((LambdaExpression)e).Parameters)
{
nonEvaluatableParameters.Add(parameter);
}

break;
}

case ExpressionType.Constant:
{
if (dc != null && typeof(EntityQueryable<>).IsSameOrParentOf(e.Type) || typeof(DbSet<>).IsSameOrParentOf(e.Type))
Expand Down Expand Up @@ -905,14 +917,18 @@ TransformInfo LocalTransform(Expression e)

if (typeof(IQueryable<>).IsSameOrParentOf(methodCall.Type))
{
// Invoking function to evaluate EF's Subquery located in function

var obj = EvaluateExpression(methodCall.Object);
var arguments = methodCall.Arguments.Select(EvaluateExpression).ToArray();
if (methodCall.Method.Invoke(obj, arguments) is IQueryable result)
if (null == methodCall.Find(nonEvaluatableParameters,
(c, t) => t.NodeType == ExpressionType.Parameter && c.Contains(t)))
{
if (!ExpressionEqualityComparer.Instance.Equals(methodCall, result.Expression))
return new TransformInfo(result.Expression, false, true);
// Invoking function to evaluate EF's Subquery located in function

var obj = EvaluateExpression(methodCall.Object);
var arguments = methodCall.Arguments.Select(EvaluateExpression).ToArray();
if (methodCall.Method.Invoke(obj, arguments) is IQueryable result)
{
if (!ExpressionEqualityComparer.Instance.Equals(methodCall, result.Expression))
return new TransformInfo(result.Expression, false, true);
}
}
}

Expand Down

0 comments on commit c34191a

Please sign in to comment.