Skip to content

Commit

Permalink
Query: Convert MaterializeCollectionNavigation to expression from met…
Browse files Browse the repository at this point in the history
…hodCall

For easier processing in the tree
  • Loading branch information
smitpatel committed Jul 1, 2019
1 parent 9e3b10d commit d6da983
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,16 @@ public override Expression Visit(Expression expression)
Expression.Constant(parameterExpression.Name));
}

if (expression is MethodCallExpression methodCallExpression)
if (expression is MaterializeCollectionNavigationExpression materializeCollectionNavigationExpression)
{
if (methodCallExpression.Method.Name == "MaterializeCollectionNavigation")
{
var result = _queryableMethodTranslatingExpressionVisitor.TranslateSubquery(methodCallExpression.Arguments[0]);
var navigation = (INavigation)((ConstantExpression)methodCallExpression.Arguments[1]).Value;

return _selectExpression.AddCollectionProjection(result, navigation, null);
}
return _selectExpression.AddCollectionProjection(
_queryableMethodTranslatingExpressionVisitor.TranslateSubquery(
materializeCollectionNavigationExpression.Subquery),
materializeCollectionNavigationExpression.Navigation, null);
}

if (expression is MethodCallExpression methodCallExpression)
{
if (methodCallExpression.Method.IsGenericMethod
&& methodCallExpression.Method.DeclaringType == typeof(Enumerable)
&& methodCallExpression.Method.Name == nameof(Enumerable.ToList))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Linq.Expressions;
using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Query.Expressions.Internal;
using Microsoft.EntityFrameworkCore.Query.Internal;

namespace Microsoft.EntityFrameworkCore.Query.NavigationExpansion
{
public class MaterializeCollectionNavigationExpression : Expression, IPrintable
{
public MaterializeCollectionNavigationExpression(Expression subquery, INavigation navigation)
{
Subquery = subquery;
Navigation = navigation;
}

public virtual Expression Subquery { get; }
public virtual INavigation Navigation { get; }

public override ExpressionType NodeType => ExpressionType.Extension;
public override Type Type => Navigation.ClrType;

public virtual void Print(ExpressionPrinter expressionPrinter)
{
expressionPrinter.StringBuilder.Append($"MaterializeCollectionNavigation({Navigation}, ");
expressionPrinter.Visit(Subquery);
expressionPrinter.StringBuilder.Append(")");
}

protected override Expression VisitChildren(ExpressionVisitor visitor)
{
var subquery = visitor.Visit(Subquery);

return subquery != Subquery
? new MaterializeCollectionNavigationExpression(subquery, Navigation)
: this;
}


}
}
15 changes: 0 additions & 15 deletions src/EFCore/Query/NavigationExpansion/NavigationExpansionHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
using System.Reflection;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.EntityFrameworkCore.Query.Expressions.Internal;
using Microsoft.EntityFrameworkCore.Query.Internal;

Expand Down Expand Up @@ -276,19 +275,5 @@ public static Expression CreateNullKeyExpression(Type resultType, int keyCount)
Expression.Constant(null),
keyCount)))
: (Expression)Expression.Constant(null);

public static readonly MethodInfo MaterializeCollectionNavigationMethodInfo
= typeof(NavigationExpansionHelpers).GetTypeInfo()
.GetDeclaredMethod(nameof(MaterializeCollectionNavigation));

public static TResult MaterializeCollectionNavigation<TResult, TEntity>(
IEnumerable<object> elements,
INavigation navigation)
where TResult : IEnumerable<TEntity>
{
var collection = navigation.GetCollectionAccessor().Create(elements);

return (TResult)collection;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,16 +83,7 @@ protected override Expression VisitExtension(Expression extensionExpression)

if (state.MaterializeCollectionNavigation != null)
{
var entityType = state.MaterializeCollectionNavigation.ClrType.IsGenericType
? state.MaterializeCollectionNavigation.ClrType.GetGenericArguments()[0]
: state.MaterializeCollectionNavigation.GetTargetType().ClrType;

result = Expression.Call(
NavigationExpansionHelpers.MaterializeCollectionNavigationMethodInfo.MakeGenericMethod(
state.MaterializeCollectionNavigation.ClrType,
entityType),
result,
Expression.Constant(state.MaterializeCollectionNavigation));
result = new MaterializeCollectionNavigationExpression(result, state.MaterializeCollectionNavigation);
}

if (navigationExpansionExpression.Type != result.Type && navigationExpansionExpression.Type.IsGenericType)
Expand Down

0 comments on commit d6da983

Please sign in to comment.