Я отлично нашел динамический порядок Марка Гравелла:
Dynamic LINQ OrderBy на IEnumerable
Я поставил его в классе, LinqHelper
. В этом классе я также создал два новых класса, так что в моем коде я могу сделать это:
var q = db.tblJobHeaders;
LinqHelper.OrderByCollection OBys = new LinqHelper.OrderByCollection();
OBys.AddOrderBy("some field", true);
OBys.AddOrderBy("anotherfield", false);
OBys.ExecuteOrderBys(q);
Вот классы, которые нужно достичь:
///
/// A collection of order bys
///
public class OrderByCollection
{
private ArrayList Orderings = new ArrayList();
public OrderByCollection(){ }
///
/// Add an order by to this collection
///
public void AddOrderBy(string Field, bool Descending)
{
OrderByObj NewObj = new OrderByObj(Descending, Field);
this.Orderings.Add(NewObj);
}
///
/// Executes the order bys
///
public IOrderedQueryable ExecuteOrderBys(this IOrderedQueryable source)
{
int ExecutionIndex = 0;
foreach (OrderByObj O in this.Orderings)
{
if (ExecutionIndex == 0)
{
if (O.Descending)
source = LinqHelper.OrderByDescending(source, O.Field);
else
source = LinqHelper.OrderBy(source, O.Field);
}
else
{
if (O.Descending)
source = LinqHelper.ThenByDescending(source, O.Field);
else
source = LinqHelper.ThenBy(source, O.Field);
}
ExecutionIndex++;
}
return (IOrderedQueryable)source;
}
}
///
/// An order by object
///
private class OrderByObj
{
public bool Descending { get; set; }
public string Field { get; set; }
public OrderByObj(bool IsDescending, string DatabaseField)
{
this.Descending = IsDescending;
this.Field = DatabaseField;
}
}
Как бы то ни было, я новичок в передаче переменных Linq функциям (смущает мне немного). В настоящее время я получаю сообщение об ошибке:
OBys.ExecuteOrderBys(q);
Что дает ошибку:
Аргументы типа для метода 'LinqHelper.OrderByCollection.ExecuteOrderBys (System.Linq.IOrderedQueryable)' не может быть выведено из использования. Пытаться указание аргументов типа
Я немного сбит с толку, если кто-нибудь может помочь, правильно ли я передаю var q
, а затем возвращаю его должным образом?