@@ -22,34 +22,20 @@ public IQueryable<T> IncludeEntity<T>(IQueryable<T> queryable, string includedEn
2222 public T SingleOrDefault < T > ( object query , string param , object value )
2323 {
2424 var queryable = ( IQueryable < T > ) query ;
25- var currentType = queryable . ElementType ;
26- var property = currentType . GetProperty ( param ) ;
27-
28- if ( property == null )
29- {
30- throw new ArgumentException ( $ "'{ param } ' is not a valid property of '{ currentType } '") ;
31- }
32-
33- // convert the incoming value to the target value type
34- // "1" -> 1
35- var convertedValue = Convert . ChangeType ( value , property . PropertyType ) ;
36- // {model}
37- var prm = Expression . Parameter ( currentType , "model" ) ;
38- // {model.Id}
39- var left = Expression . PropertyOrField ( prm , property . Name ) ;
40- // {1}
41- var right = Expression . Constant ( convertedValue , property . PropertyType ) ;
42- // {model.Id == 1}
43- var body = Expression . Equal ( left , right ) ;
44- var where = Expression . Lambda < Func < T , bool > > ( body , prm ) ;
45-
46- return queryable . SingleOrDefault ( where ) ;
25+ var expression = GetEqualityExpressionForProperty ( queryable , param , value ) ;
26+ return queryable . SingleOrDefault ( expression ) ;
4727 }
4828
4929 public IQueryable < T > Where < T > ( object query , string param , object value )
5030 {
5131 var queryable = ( IQueryable < T > ) query ;
52- var currentType = queryable . ElementType ;
32+ var expression = GetEqualityExpressionForProperty ( queryable , param , value ) ;
33+ return queryable . Where ( expression ) ;
34+ }
35+
36+ private Expression < Func < T , bool > > GetEqualityExpressionForProperty < T > ( IQueryable < T > query , string param , object value )
37+ {
38+ var currentType = query . ElementType ;
5339 var property = currentType . GetProperty ( param ) ;
5440
5541 if ( property == null )
@@ -68,9 +54,7 @@ public IQueryable<T> Where<T>(object query, string param, object value)
6854 var right = Expression . Constant ( convertedValue , property . PropertyType ) ;
6955 // {model.Id == 1}
7056 var body = Expression . Equal ( left , right ) ;
71- var where = Expression . Lambda < Func < T , bool > > ( body , prm ) ;
72-
73- return queryable . Where ( where ) ;
57+ return Expression . Lambda < Func < T , bool > > ( body , prm ) ;
7458 }
7559 }
7660}
0 commit comments