Model :
class XXX{
...
[DisplayColumn(0)]
[SortingColumn(0)]
public int? A { get; set; }
[DisplayColumn(1)]
[SortingColumn(1)]
public string B { get; set; }
...
}
Helper class :
public class SortingColumnAttribute : Attribute
{
public int Index { get; }
public SortingColumnAttribute(int index)
{
Index = index;
}
}
public class DisplayColumnAttribute : Attribute
{
public int Index { get; }
public DisplayColumnAttribute(int index)
{
Index = index;
}
}
public static class DataTableQueryString
{
public static string OrderingColumn = "order[0][column]";
public static string OrderingDir = "order[0][dir]";
public static string Searching = "search[value]";
}
public static class DataTableHelper
{
public static IList<string> DisplayColumns<T>()
{
var result = new Dictionary<int, string>();
var props = typeof(T).GetProperties();
foreach (var propertyInfo in props)
{
var propAttr =
propertyInfo
.GetCustomAttributes(false)
.OfType<DisplayColumnAttribute>()
.FirstOrDefault();
if (propAttr != null)
{
result.Add(propAttr.Index,propertyInfo.Name);
}
}
return result.OrderBy(x => x.Key).Select(x => x.Value).ToList();
}
public static string SoringColumnName<T>(string columnIndex)
{
int index;
if (!int.TryParse(columnIndex, out index))
{
throw new ArgumentOutOfRangeException();
}
return SoringColumnName<T>(index);
}
public static string SoringColumnName<T>(int index)
{
var props = typeof(T).GetProperties();
foreach (var propertyInfo in props)
{
var propAttr =
propertyInfo
.GetCustomAttributes(false)
.OfType<SortingColumnAttribute>()
.FirstOrDefault();
if (propAttr != null && propAttr.Index == index)
{
return propertyInfo.Name;
}
}
return "";
}
}
Query:
...
var query = context.BusCaptains
.Where(x => ...)
.OrderByEx(sortDirection, sortField)
.Skip(start)
.Take(pageSize);
...
LINQ Helper :
...
public static IQueryable<T> OrderByEx<T>(this IQueryable<T> q, string direction, string fieldName)
{
try
{
var customProperty = typeof(T).GetCustomAttributes(false).OfType<ColumnAttribute>().FirstOrDefault();
if (customProperty != null)
{
fieldName = customProperty.Name;
}
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, fieldName);
var exp = Expression.Lambda(prop, param);
string method = direction.ToLower() == "asc" ? "OrderBy" : "OrderByDescending";
Type[] types = new Type[] {q.ElementType, exp.Body.Type};
var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
catch (Exception ex)
{
_log.ErrorFormat("error form OrderByEx.");
_log.Error(ex);
throw ;
}
}
...








