support null checking on group :)
This commit is contained in:
@@ -15,6 +15,8 @@ namespace PoweredSoft.DynamicLinq.Fluent
|
||||
|
||||
public IQueryable Query { get; protected set; }
|
||||
|
||||
public bool IsNullCheckingEnabled { get; protected set; } = false;
|
||||
|
||||
public GroupBuilder(IQueryable query)
|
||||
{
|
||||
Query = query;
|
||||
@@ -41,6 +43,12 @@ namespace PoweredSoft.DynamicLinq.Fluent
|
||||
return this;
|
||||
}
|
||||
|
||||
public GroupBuilder NullChecking(bool nullChecking = true)
|
||||
{
|
||||
IsNullCheckingEnabled = nullChecking;
|
||||
return this;
|
||||
}
|
||||
|
||||
public GroupBuilder UseType(Type type)
|
||||
{
|
||||
Type = type;
|
||||
@@ -58,7 +66,7 @@ namespace PoweredSoft.DynamicLinq.Fluent
|
||||
if (Empty)
|
||||
throw new Exception("No group specified, please specify at least one group");
|
||||
|
||||
var ret = QueryableHelpers.GroupBy(Query, Query.ElementType, Parts, Type, EqualityComparerType);
|
||||
var ret = QueryableHelpers.GroupBy(Query, Query.ElementType, Parts, groupToType: Type, equalityCompareType: EqualityComparerType, nullChecking: IsNullCheckingEnabled);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
||||
|
||||
|
||||
|
||||
public static IQueryable GroupBy(IQueryable query, Type type, List<(string path, string propertyName)> parts, Type groupToType = null, Type equalityCompareType = null)
|
||||
public static IQueryable GroupBy(IQueryable query, Type type, List<(string path, string propertyName)> parts, Type groupToType = null, Type equalityCompareType = null, bool nullChecking = false)
|
||||
{
|
||||
// EXPRESSION
|
||||
var parameter = Expression.Parameter(type, "t");
|
||||
@@ -94,22 +94,12 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
||||
// resolve part expression and create the fields inside the anonymous type.
|
||||
parts.ForEach(part =>
|
||||
{
|
||||
var partExpression = ResolvePathForExpression(parameter, part.path);
|
||||
var partExpression = CreateSelectExpression(query, parameter, SelectTypes.Path, part.path, SelectCollectionHandling.LeaveAsIs, nullChecking: nullChecking);
|
||||
fields.Add((partExpression.Type, part.propertyName));
|
||||
partExpressions.Add((partExpression, part.propertyName));
|
||||
});
|
||||
|
||||
var keyType = groupToType ?? DynamicClassFactory.CreateType(fields);
|
||||
|
||||
/*
|
||||
var constructorTypes = fields.Select(t => t.type).ToArray();
|
||||
var constructor = anonymousType.GetConstructor(constructorTypes);
|
||||
var newExpression = Expression.New(constructor, partExpressions);
|
||||
var genericMethod = Constants.GroupByMethod.MakeGenericMethod(type, anonymousType);
|
||||
var lambda = Expression.Lambda(newExpression, parameter);
|
||||
var groupByExpression = Expression.Call(genericMethod, query.Expression, lambda);
|
||||
var result = query.Provider.CreateQuery(groupByExpression);*/
|
||||
|
||||
var ctor = Expression.New(keyType);
|
||||
var bindings = partExpressions.Select(partExpression => Expression.Bind(keyType.GetProperty(partExpression.propertyName), partExpression.expression)).ToArray();
|
||||
var mi = Expression.MemberInit(ctor, bindings);
|
||||
|
||||
Reference in New Issue
Block a user