2015-06-12 149 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