better expression logic should be easier to implement null checks now ;)
This commit is contained in:
@@ -62,10 +62,11 @@ namespace PoweredSoft.DynamicLinq.Parser
|
||||
});
|
||||
}
|
||||
|
||||
private ExpressionParserPieceGroup CreateAndAddGroup(List<ExpressionParserPieceGroup> groups, ParameterExpression parameter)
|
||||
private ExpressionParserPieceGroup CreateAndAddGroup(List<ExpressionParserPieceGroup> groups, ParameterExpression parameter, ExpressionParserPieceGroup parent)
|
||||
{
|
||||
var group = new ExpressionParserPieceGroup();
|
||||
group.ParameterExpression = parameter;
|
||||
group.Parameter = parameter;
|
||||
group.Parent = parent;
|
||||
groups.Add(group);
|
||||
return group;
|
||||
}
|
||||
@@ -74,12 +75,12 @@ namespace PoweredSoft.DynamicLinq.Parser
|
||||
{
|
||||
var groups = new List<ExpressionParserPieceGroup>();
|
||||
|
||||
var group = CreateAndAddGroup(groups, Parameter);
|
||||
var group = CreateAndAddGroup(groups, Parameter, null);
|
||||
Pieces.ForEach(piece =>
|
||||
{
|
||||
group.Pieces.Add(piece);
|
||||
if (piece.IsGenericEnumerable)
|
||||
group = CreateAndAddGroup(groups, Expression.Parameter(piece.EnumerableType));
|
||||
group = CreateAndAddGroup(groups, Expression.Parameter(piece.EnumerableType), group);
|
||||
});
|
||||
|
||||
return groups;
|
||||
|
||||
@@ -9,10 +9,11 @@ namespace PoweredSoft.DynamicLinq.Parser
|
||||
public class ExpressionParserPieceGroup
|
||||
{
|
||||
public List<ExpressionParserPiece> Pieces { get; set; } = new List<ExpressionParserPiece>();
|
||||
public ParameterExpression ParameterExpression { get; set; }
|
||||
public ParameterExpression Parameter { get; set; }
|
||||
public ExpressionParserPieceGroup Parent { get; set; }
|
||||
|
||||
#if DEBUG
|
||||
public override string ToString() => $"{ParameterExpression?.ToString()} is {ParameterExpression?.Type} | {(Pieces == null ? "" : string.Join(" -> ", Pieces.Select(t2 => t2.ToString())))}";
|
||||
public override string ToString() => $"{Parameter?.ToString()} is {Parameter?.Type} | {(Pieces == null ? "" : string.Join(" -> ", Pieces.Select(t2 => t2.ToString())))}";
|
||||
|
||||
public object CompileSimpleExpress(SelectNullHandling nullHandling)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Text;
|
||||
|
||||
@@ -13,16 +14,19 @@ namespace PoweredSoft.DynamicLinq.Parser
|
||||
return result;
|
||||
}
|
||||
|
||||
public static LambdaExpression CompileGroup(this ExpressionParserPieceGroup group, SelectNullHandling NullHandling)
|
||||
public static Expression CompileGroup(this ExpressionParserPieceGroup group, SelectNullHandling NullHandling)
|
||||
{
|
||||
var expr = group.ParameterExpression as Expression;
|
||||
var expr = group.Parameter as Expression;
|
||||
group.Pieces.ForEach(piece =>
|
||||
{
|
||||
expr = Expression.PropertyOrField(expr, piece.Name);
|
||||
});
|
||||
return expr;
|
||||
}
|
||||
|
||||
var ret = Expression.Lambda(expr, group.ParameterExpression);
|
||||
return ret;
|
||||
public static Type GroupEnumerableType(this ExpressionParserPieceGroup group)
|
||||
{
|
||||
return group.Pieces.Last().EnumerableType;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user