2015-06-12 153 views
0

我正在写一个C#程序,我有以下方法。 我发现我在这种方法中多次编写相同的代码。我无法将代码分解为可重用的部分。有人可以看看它并建议吗?如何重构此代码以删除重复的代码

private static IOrderedQueryable<T> FormatQuery<T>(IQueryable<T> query, Expression property, ParameterExpression sortParam, SortFilter sortFilter, ref IOrderedQueryable<T> orderedQuery) 
{ 
    if (property.Type == typeof(int)) 
    { 
     var sortExpr = Expression.Lambda<Func<T, int>>(property, new[] { sortParam }); 
     orderedQuery = !sortFilter.IsDescending 
      ? (orderedQuery == null ? query.OrderBy(sortExpr) : orderedQuery.ThenBy(sortExpr)) 
      : (orderedQuery == null ? query.OrderByDescending(sortExpr) : orderedQuery.ThenByDescending(sortExpr)); 
    } 
    else if (property.Type == typeof(bool)) 
    { 
     var sortExpr = Expression.Lambda<Func<T, bool>>(property, new[] { sortParam }); 
     orderedQuery = !sortFilter.IsDescending 
      ? (orderedQuery == null ? query.OrderBy(sortExpr) : orderedQuery.ThenBy(sortExpr)) 
      : (orderedQuery == null ? query.OrderByDescending(sortExpr) : orderedQuery.ThenByDescending(sortExpr)); 
    } 
    else if (property.Type == typeof(DateTimeOffset?)) 
    { 
     var sortExpr = Expression.Lambda<Func<T, DateTimeOffset>>(
     Expression.Coalesce(property, Expression.Constant(DateTimeOffset.MaxValue)), new[] { sortParam }); 
     orderedQuery = !sortFilter.IsDescending 
      ? (orderedQuery == null ? query.OrderBy(sortExpr) : orderedQuery.ThenBy(sortExpr)) 
      : (orderedQuery == null ? query.OrderByDescending(sortExpr) : orderedQuery.ThenByDescending(sortExpr)); 
    } 
    else 
    { 
     var sortExpr = Expression.Lambda<Func<T, object>>(property, new[] { sortParam }); 
     orderedQuery = !sortFilter.IsDescending 
      ? (orderedQuery == null ? query.OrderBy(sortExpr) : orderedQuery.ThenBy(sortExpr)) 
      : (orderedQuery == null ? query.OrderByDescending(sortExpr) : orderedQuery.ThenByDescending(sortExpr)); 
    } 
    return orderedQuery; 
} 

在此先感谢。

回答

0

使财产<T2>代替Expression并把<T, T2>的PARAMS前,后的参数parenthesys你可以把where T2 : Expression,现在ü可以只使用T2房产类型,对不起,我会写更多的时候我回家我这样做从手机

编辑:好的家现在这样检查了这一点:

private static IOrderedQueryable<T> FormatQuery<T, T2>(IQueryable<T> query, T2 property, ParameterExpression sortParam, SortFilter sortFilter, ref IOrderedQueryable<T> orderedQuery) where T2 : Expression 
{ 
    var sortExpr = Expression.Lambda<Func<T, T2>>(property, new[] { sortParam }); 
    return !sortFilter.IsDescending 
     ? (orderedQuery == null ? query.OrderBy(sortExpr) : orderedQuery.ThenBy(sortExpr)) 
     : (orderedQuery == null ? query.OrderByDescending(sortExpr) : orderedQuery.ThenByDescending(sortExpr)); 
} 
1

这是否帮助?

private static IOrderedQueryable<T> FormatQuery<T>(IQueryable<T> query, Expression property, ParameterExpression sortParam, SortFilter sortFilter, ref IOrderedQueryable<T> orderedQuery) 
    { 
     if (property.Type == typeof(int)) 
     { 
      FormatQueryExtracted(query, GetSortExpr<T, int>(property, sortParam), sortFilter, ref orderedQuery); 
     } 
     else if (property.Type == typeof(bool)) 
     { 
      FormatQueryExtracted(query, GetSortExpr<T, bool>(property, sortParam), sortFilter, ref orderedQuery); 
     } 
     else if (property.Type == typeof(DateTimeOffset?)) 
     { 
      FormatQueryExtracted(query, GetSortExpr<T, DateTimeOffset>(Expression.Coalesce(property, Expression.Constant(DateTimeOffset.MaxValue)), sortParam), sortFilter, ref orderedQuery); 
     } 
     else 
     { 
      FormatQueryExtracted(query, GetSortExpr<T, object>(property, sortParam), sortFilter, ref orderedQuery); 
     } 
     return orderedQuery; 
    } 

    private static Expression<Func<T, P>> GetSortExpr<T, P>(Expression property, ParameterExpression sortParam) 
    { 
     return Expression.Lambda<Func<T, P>>(property, new[] { sortParam }); 
    } 

    private static void FormatQueryExtracted<T, P>(IQueryable<T> query, Expression<Func<T, P>> sortExpr, SortFilter sortFilter, ref IOrderedQueryable<T> orderedQuery) 
    { 
     orderedQuery = !sortFilter.IsDescending 
      ? (orderedQuery == null ? query.OrderBy(sortExpr) : orderedQuery.ThenBy(sortExpr)) 
      : (orderedQuery == null ? query.OrderByDescending(sortExpr) : orderedQuery.ThenByDescending(sortExpr)); 
    } 
+0

谢谢。这在很大程度上简化了我的代码。非常感谢你。 – sahaneru