Для моей общей сетки я сейчас делаю это, чтобы активировать сортировку:
Elements.OrderBy(column.SortExpression).AsQueryable();
В котором SortExpression имеет тип Func<T, object>
, а столбец является универсальным классом Column<T>
Я установил SortExpression в контроллере следующим образом:
new Column<OrderViewData>{Key = "ShippingDate", SortExpression = e => e.ShippingDate}
OrderBy вызывает выполнение оператора sql, который мне не нужен.
Итак, я пытаюсь заменить его на это:
Elements = from element in Elements
orderby column.SortExpression
select element;
Что не запускает выполнение sql.
Теперь, конечно, столбец. Выражение сортировки должно быть другого типа. Только я не могу понять, какого типа он должен быть и как установить его в универсальный класс в контроллере.
Я все еще должен быть в состоянии установить SortExpression в некотором роде в строгом стиле.
Любые предложения о том, как я могу заказать с помощью набора выражений где-то еще в приложении, без выполнения SQL при применении заказа к IQueryable?
@ Earwicker:
Это работает:
Expression<Func<Employee, DateTime?>> sortexpression = e => e.BirthDate;
var db = new NorthwindDataContext();
var query = from e in db.Employees
select e;
query = query.OrderBy(sortexpression);
int count = query.Count();
и генерирует:
SELECT COUNT(*) AS [value]
FROM [dbo].[Employees] AS [t0]
Когда я заменю DateTime? в первой строке с объектом:
Expression<Func<Employee, object>> sortexpression = e => e.BirthDate;
Я получаю исключение InvalidOperationException: невозможно оформить заказ по типу 'System.Object'
Теперь вы можете сказать: «тогда просто использовать DateTime?», Но я бы хотел построить столбцы в моей общей сетке, чтобы потребовать как можно меньше кода. Я не хочу, чтобы люди печатали все Expression<Func<Employee, some_type>>
. Я хочу, чтобы люди могли просто напечатать что-нибудь маленькое, например, мою первую попытку SortExpression = e => e.BirthDate
, где я использую универсальный класс Column для определения 'T'.
Как вы думаете, было бы возможно создать какое-то расширение, которое каким-то образом получит тип e.BirthDate
и затем преобразует Func<T, object>
в Expression<Func<T,some_type>>
?
Тогда я мог бы сделать что-то во внутреннем коде, например:
Elements.OrderBy (column.SortExpression.FixCast ())
Меня не волнует, что мой внутренний код в данный момент уродлив или сложен. Мне нужно правильно настроить SQL-запросы и позаботиться об удобстве использования для разработчиков, использующих сетку.
Большое спасибо за помощь!
@ earwicker 2:
var gridBuilder = new RainbowGridBuilder<Employee>("Examples_Employees")
{
Elements = GetEmployees(), //The elements (records) we will show in our grid.
//Define the columns for our grid.
Columns = new List<Column<Employee>>{
new Column<Employee> {
Key = "EmployeeId", //Key is used for sorting, selecting columns, ...
Header = "Employee Id", //The header of the column. Also used as caption in the column selection checkboxlist.
ValueExpression = e => e.EmployeeID.ToString(), //The Linq expression which will be executed on each element to fill the cell
SortExpression = e => e.EmployeeID, //The Linq expression by which to sort the elements in the grid.
Display = false}, //Is this column visible by default?
new Column<Employee> {Key = "Name", ValueExpression = e => e.FirstName + " " + e.LastName, SortExpression = e => e.LastName},
},
// Some other properties here that are irrelevant.
}