prep the field for building the select statement next.
This commit is contained in:
@@ -41,6 +41,16 @@ namespace PoweredSoft.DynamicLinq
|
||||
Descending
|
||||
}
|
||||
|
||||
public enum SelectTypes
|
||||
{
|
||||
Key,
|
||||
Count,
|
||||
LongCount,
|
||||
Sum,
|
||||
Average,
|
||||
ToList
|
||||
}
|
||||
|
||||
internal static class Constants
|
||||
{
|
||||
internal static readonly MethodInfo GroupByMethod = typeof(Queryable).GetMethods().First(t => t.Name == "GroupBy");
|
||||
|
||||
@@ -88,5 +88,15 @@ namespace PoweredSoft.DynamicLinq
|
||||
|
||||
return QueryableHelpers.GroupBy(query, type, groupBuilder.Parts, groupBuilder.Type, groupBuilder.EqualityComparerType);
|
||||
}
|
||||
|
||||
public static IQueryable Select(this IQueryable query, Action<SelectBuilder> callback)
|
||||
{
|
||||
var sb = new SelectBuilder();
|
||||
callback(sb);
|
||||
if (sb.Empty)
|
||||
throw new Exception("No select specified, please specify at least one select path");
|
||||
|
||||
return query;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,112 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace PoweredSoft.DynamicLinq.Fluent
|
||||
{
|
||||
public class SelectPart
|
||||
{
|
||||
public string Path { get; set; }
|
||||
public string PropertyName { get; set; }
|
||||
public SelectTypes SelectType { get; set; }
|
||||
}
|
||||
|
||||
public class SelectBuilder
|
||||
{
|
||||
public List<SelectPart> Parts = new List<SelectPart>();
|
||||
|
||||
public bool Empty => Parts?.Count == 0;
|
||||
|
||||
protected void throwIfUsedOrEmpty(string propertyName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(propertyName))
|
||||
throw new ArgumentNullException($"{propertyName} cannot end up be empty.");
|
||||
|
||||
if (Parts.Any(t => t.PropertyName == propertyName))
|
||||
throw new Exception($"{propertyName} is already used");
|
||||
}
|
||||
|
||||
public SelectBuilder Key(string propertyName, string path = null)
|
||||
{
|
||||
if (propertyName == null)
|
||||
propertyName = path.Split('.').LastOrDefault();
|
||||
|
||||
throwIfUsedOrEmpty(propertyName);
|
||||
|
||||
Parts.Add(new SelectPart
|
||||
{
|
||||
Path = path == null ? "Key" : $"Key.{path}",
|
||||
PropertyName = propertyName,
|
||||
SelectType = SelectTypes.Key
|
||||
});
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public SelectBuilder Count(string propertyName)
|
||||
{
|
||||
throwIfUsedOrEmpty(propertyName);
|
||||
Parts.Add(new SelectPart
|
||||
{
|
||||
PropertyName = propertyName,
|
||||
SelectType = SelectTypes.Count
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
public SelectBuilder LongCount(string propertyName)
|
||||
{
|
||||
throwIfUsedOrEmpty(propertyName);
|
||||
Parts.Add(new SelectPart
|
||||
{
|
||||
PropertyName = propertyName,
|
||||
SelectType = SelectTypes.LongCount
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
public SelectBuilder Sum(string path, string propertyName = null)
|
||||
{
|
||||
if (propertyName == null)
|
||||
propertyName = path.Split('.').LastOrDefault();
|
||||
|
||||
throwIfUsedOrEmpty(propertyName);
|
||||
|
||||
Parts.Add(new SelectPart
|
||||
{
|
||||
Path = path,
|
||||
PropertyName = propertyName,
|
||||
SelectType = SelectTypes.Sum
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
public SelectBuilder Average(string path, string propertyName = null)
|
||||
{
|
||||
if (propertyName == null)
|
||||
propertyName = path.Split('.').LastOrDefault();
|
||||
|
||||
throwIfUsedOrEmpty(propertyName);
|
||||
|
||||
Parts.Add(new SelectPart
|
||||
{
|
||||
Path = path,
|
||||
PropertyName = propertyName,
|
||||
SelectType = SelectTypes.Average
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
public SelectBuilder ToList(string propertyName)
|
||||
{
|
||||
throwIfUsedOrEmpty(propertyName);
|
||||
Parts.Add(new SelectPart
|
||||
{
|
||||
PropertyName = propertyName,
|
||||
SelectType = SelectTypes.ToList
|
||||
});
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user