Skip to content

Commit 48ae63f

Browse files
committed
refactor(GenericDataAccess): consolidate query code
1 parent 526aa5f commit 48ae63f

File tree

1 file changed

+10
-26
lines changed

1 file changed

+10
-26
lines changed

JsonApiDotNetCore/Data/GenericDataAccess.cs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)