Allow possibility of specifying the type to group with :)
This commit is contained in:
parent
9db5d74284
commit
165cc15d0a
@ -8,6 +8,12 @@ using PoweredSoft.DynamicLinq;
|
||||
|
||||
namespace PoweredSoft.DynamicLinq.Test
|
||||
{
|
||||
internal class TestStructure
|
||||
{
|
||||
public long ClientId { get; set; }
|
||||
public decimal B { get; set; }
|
||||
}
|
||||
|
||||
[TestClass]
|
||||
public class GroupingTests
|
||||
{
|
||||
@ -34,6 +40,11 @@ namespace PoweredSoft.DynamicLinq.Test
|
||||
.AsQueryable()
|
||||
.GroupBy(t => t.Path("ClientId").Path("NetSales", "B"));
|
||||
|
||||
var dynamicSyntax3 = TestData.Sales
|
||||
.AsQueryable()
|
||||
.GroupBy(t => t.UseType(typeof(TestStructure)).Path("ClientId").Path("NetSales", "B"));
|
||||
|
||||
|
||||
/*
|
||||
.Select(t => new
|
||||
{
|
||||
|
@ -86,7 +86,7 @@ namespace PoweredSoft.DynamicLinq
|
||||
if (groupBuilder.Empty)
|
||||
throw new Exception("No group specified, please specify at least one group");
|
||||
|
||||
return QueryableHelpers.GroupBy(query, type, groupBuilder.Parts);
|
||||
return QueryableHelpers.GroupBy(query, type, groupBuilder.Parts, groupBuilder.Type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ namespace PoweredSoft.DynamicLinq.Fluent
|
||||
public class GroupBuilder
|
||||
{
|
||||
public List<(string path, string propertyName)> Parts { get; set; } = new List<(string path, string propertyName)>();
|
||||
public Type Type { get; set; }
|
||||
public bool Empty => !Parts.Any();
|
||||
|
||||
public GroupBuilder Path(string path, string propertyName = null)
|
||||
@ -30,5 +31,11 @@ namespace PoweredSoft.DynamicLinq.Fluent
|
||||
Parts.Add((path, propertyName));
|
||||
return this;
|
||||
}
|
||||
|
||||
public GroupBuilder UseType(Type type)
|
||||
{
|
||||
Type = type;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static IQueryable GroupBy(IQueryable query, Type type, List<(string path, string propertyName)> parts)
|
||||
public static IQueryable GroupBy(IQueryable query, Type type, List<(string path, string propertyName)> parts, Type groupToType = null)
|
||||
{
|
||||
// EXPRESSION
|
||||
var parameter = Expression.Parameter(type, "t");
|
||||
@ -93,7 +93,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
||||
partExpressions.Add((partExpression, part.propertyName));
|
||||
});
|
||||
|
||||
var anonymousType = TypeHelpers.CreateSimpleAnonymousType(fields);
|
||||
var anonymousType = groupToType ?? TypeHelpers.CreateSimpleAnonymousType(fields);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -36,8 +36,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Use this to create anonymous type concstructor for LINQ queries :)
|
||||
/// https://stackoverflow.com/questions/6879279/using-typebuilder-to-create-a-pass-through-constructor-for-the-base-class
|
||||
/// Use this to create anonymous type
|
||||
/// </summary>
|
||||
/// <param name="fields"></param>
|
||||
/// <returns></returns>
|
||||
@ -50,11 +49,16 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
||||
{
|
||||
CreatePropertyOnType(dynamicType, field.name, field.type);
|
||||
});
|
||||
// not needed at the end.
|
||||
// CreateConstructorWithAllPropsOnType(dynamicType, fields);
|
||||
var ret = dynamicType.CreateTypeInfo();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* concstructor
|
||||
* https://stackoverflow.com/questions/6879279/using-typebuilder-to-create-a-pass-through-constructor-for-the-base-class
|
||||
* works but wasn't needed at the end.
|
||||
private static void CreateConstructorWithAllPropsOnType(TypeBuilder dynamicType, List<(Type type, string name)> fields)
|
||||
{
|
||||
var ctor = dynamicType.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, fields.Select(t => t.type).ToArray());
|
||||
@ -76,7 +80,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
|
||||
}
|
||||
emitter.Emit(OpCodes.Call, ctor);
|
||||
emitter.Emit(OpCodes.Ret);
|
||||
}
|
||||
}*/
|
||||
|
||||
internal static void CreatePropertyOnType(TypeBuilder typeBuilder, string propertyName, Type propertyType)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user