1818
1919using System . Collections . Generic ;
2020using System . Linq ;
21- using System . Linq . Dynamic . Core ;
2221using System . Linq . Expressions ;
2322using DomainCommonExtensions . CommonExtensions ;
23+ using DomainCommonExtensions . Helpers . Internal . AnonymousSelect ;
24+
25+ #region OLD Using System.Linq.Dynamic.Core
26+ //using System.Linq.Dynamic.Core;
27+ //using System.Linq.Dynamic.Core.Parser;
28+ #endregion
2429
2530#endregion
2631
@@ -32,8 +37,57 @@ namespace DomainCommonExtensions.ArraysExtensions
3237 /// <remarks></remarks>
3338 public static class DynamicListExtensions
3439 {
40+ #region OLD Using System.Linq.Dynamic.Core
41+
42+ /*
43+ // Using System.Linq.Dynamic.Core
44+ // // <summary>
45+ // // Parse input data (List) to dynamic result (list)
46+ // // </summary>
47+ // // <param name="input">List of T input data</param>
48+ // // <param name="fields">Required fields</param>
49+ // // <returns></returns>
50+ // // <typeparam name="T"></typeparam>
51+ // // <remarks></remarks>
52+ // public static IList<dynamic> ParseListOfTInDynamic<T>(this List<T> input, IEnumerable<string> fields = null)
53+ // {
54+ // var data = input.AsQueryable();
55+ // var requiredFields = typeof(T).GetSelectedFieldFromEntity(fields);
56+ //
57+ // var result = data.Select("new {" + requiredFields + "}").ToDynamicList();
58+ //
59+ // return result;
60+ // }
61+
62+ */
63+
64+ /*
65+ // Using System.Linq.Dynamic.Core
66+ // /// <summary>
67+ // /// Parse input data (IEnumerable) to dynamic result (list)
68+ // /// </summary>
69+ // /// <param name="input">IEnumerable of T input data</param>
70+ // /// <param name="fields">Required fields</param>
71+ // /// <returns></returns>
72+ // /// <typeparam name="T"></typeparam>
73+ // /// <remarks></remarks>
74+ // public static IList<dynamic> ParseEnumerableOfTInDynamic<T>(this IEnumerable<T> input,
75+ // IEnumerable<string> fields = null)
76+ // {
77+ // var data = input.AsQueryable();
78+ // var requiredFields = typeof(T).GetSelectedFieldFromEntity(fields);
79+
80+ // var result = data.Select("new {" + requiredFields + "}").ToDynamicList();
81+
82+ // return result;
83+ // }
84+
85+ */
86+
87+ #endregion
88+
3589 /// <summary>
36- /// Parse input data (List ) to dynamic result (list)
90+ /// Parse input data (IEnumerable ) to dynamic result (list)
3791 /// </summary>
3892 /// <param name="input">List of T input data</param>
3993 /// <param name="fields">Required fields</param>
@@ -44,29 +98,45 @@ public static IList<dynamic> ParseListOfTInDynamic<T>(this List<T> input, IEnume
4498 {
4599 var data = input . AsQueryable ( ) ;
46100 var requiredFields = typeof ( T ) . GetSelectedFieldFromEntity ( fields ) ;
101+ var parameter = Expression . Parameter ( data . ElementType , "x" ) ;
102+ var lambdaExpression = ExpressionHelper . ParseLambda ( parameter , data . ElementType , false , requiredFields . Split ( ',' ) ) ;
103+
104+ var selectCall = Expression . Call (
105+ typeof ( Queryable ) ,
106+ "Select" ,
107+ new [ ] { parameter . Type , lambdaExpression . Body . Type /*source.ElementType*/ } ,
108+ data . Expression ,
109+ Expression . Quote ( lambdaExpression ) ) ;
47110
48- var result = data . Select ( "new {" + requiredFields + "}" ) . ToDynamicList ( ) ;
111+ var result = data . Provider . CreateQuery ( selectCall ) ;
49112
50- return result ;
113+ return result . Cast < dynamic > ( ) . ToList ( ) ;
51114 }
52-
53115 /// <summary>
54- /// Parse input data (IEnumerable ) to dynamic result (list)
116+ /// Parse input data (List ) to dynamic result (list)
55117 /// </summary>
56118 /// <param name="input">IEnumerable of T input data</param>
57119 /// <param name="fields">Required fields</param>
58120 /// <returns></returns>
59121 /// <typeparam name="T"></typeparam>
60122 /// <remarks></remarks>
61- public static IList < dynamic > ParseEnumerableOfTInDynamic < T > ( this IEnumerable < T > input ,
62- IEnumerable < string > fields = null )
123+ public static IList < dynamic > ParseEnumerableOfTInDynamic < T > ( this IEnumerable < T > input , IEnumerable < string > fields = null )
63124 {
64125 var data = input . AsQueryable ( ) ;
65126 var requiredFields = typeof ( T ) . GetSelectedFieldFromEntity ( fields ) ;
127+ var parameter = Expression . Parameter ( data . ElementType , "x" ) ;
128+ var lambdaExpression = ExpressionHelper . ParseLambda ( parameter , data . ElementType , false , requiredFields . Split ( ',' ) ) ;
66129
67- var result = data . Select ( "new {" + requiredFields + "}" ) . ToDynamicList ( ) ;
130+ var selectCall = Expression . Call (
131+ typeof ( Queryable ) ,
132+ "Select" ,
133+ new [ ] { parameter . Type , lambdaExpression . Body . Type /*source.ElementType*/ } ,
134+ data . Expression ,
135+ Expression . Quote ( lambdaExpression ) ) ;
136+
137+ var result = data . Provider . CreateQuery ( selectCall ) ;
68138
69- return result ;
139+ return result . Cast < dynamic > ( ) . ToList ( ) ;
70140 }
71141
72142 /// <summary>
@@ -79,12 +149,36 @@ public static IList<dynamic> ParseEnumerableOfTInDynamic<T>(this IEnumerable<T>
79149 public static IQueryable SelectProperty ( this IQueryable source , string prop )
80150 {
81151 var parameter = Expression . Parameter ( source . ElementType , "x" ) ;
82- var property = prop . Split ( ',' )
83- . Aggregate ( ( Expression ) parameter , Expression . Property ) ;
84- var selector = Expression . Lambda ( property , parameter ) ;
152+ var propEx = Expression . Property ( parameter , prop ) ;
153+ var selector = Expression . Lambda ( propEx , parameter ) ;
154+ var selectCall = Expression . Call (
155+ typeof ( Queryable ) ,
156+ "Select" ,
157+ new [ ] { parameter . Type , propEx . Type } ,
158+ source . Expression ,
159+ Expression . Quote ( selector ) ) ;
160+
161+ return source . Provider . CreateQuery ( selectCall ) ;
162+ }
163+
164+ /// <summary>
165+ /// Generate select multiple properties
166+ /// </summary>
167+ /// <param name="source">Data source IQueryable</param>
168+ /// <param name="props">Properties name</param>
169+ /// <returns></returns>
170+ /// <remarks></remarks>
171+ public static IQueryable SelectMultipleProperties ( this IQueryable source , params string [ ] props )
172+ {
173+ var parameter = Expression . Parameter ( source . ElementType , "x" ) ;
174+ var lambdaExpression = ExpressionHelper . ParseLambda ( parameter , source . ElementType , true , props ) ;
175+
85176 var selectCall = Expression . Call (
86- typeof ( Queryable ) , "Select" , new [ ] { parameter . Type , property . Type } ,
87- source . Expression , Expression . Quote ( selector ) ) ;
177+ typeof ( Queryable ) ,
178+ "Select" ,
179+ new [ ] { parameter . Type , lambdaExpression . Body . Type /*source.ElementType*/ } ,
180+ source . Expression ,
181+ Expression . Quote ( lambdaExpression ) ) ;
88182
89183 return source . Provider . CreateQuery ( selectCall ) ;
90184 }
0 commit comments