GridView ObjectDataSource LINQ Пейджинг и сортировка с использованием запроса нескольких таблиц
Я пытаюсь создать источник данных объекта разбивки на страницы и сортировки, который перед выполнением возвращает все результаты, затем сортирует эти результаты перед фильтрацией, а затем использует методы take и skip с целью извлечения только подмножества результатов из базы данных (сохранение на база данных трафика). это основано на следующей статье:
http://www.singingeels.com/Blogs/Nullable/2008/03/26/Dynamic_LINQ_OrderBy_using_String_Names.aspx
Теперь мне удалось заставить это работать, даже создавая лямбда-выражения, отражающие выражение сортировки, возвращаемое из сетки, даже выясняя тип данных для сортировки по DateTime и Decimal.
public static string GetReturnType<TInput>(string value)
{
var param = Expression.Parameter(typeof(TInput), "o");
Expression a = Expression.Property(param, "DisplayPriceType");
Expression b = Expression.Property(a, "Name");
Expression converted = Expression.Convert(Expression.Property(param, value), typeof(object));
Expression<Func<TInput, object>> mySortExpression = Expression.Lambda<Func<TInput, object>>(converted, param);
UnaryExpression member = (UnaryExpression)mySortExpression.Body;
return member.Operand.Type.FullName;
}
Теперь у меня проблема в том, что многие из запросов возвращают объединенные таблицы, и я хотел бы отсортировать поля из других таблиц.
Таким образом, при выполнении запроса вы можете создать функцию, которая будет назначать свойства из других таблиц свойствам, созданным в частичном классе.
public static Account InitAccount(Account account)
{
account.CurrencyName = account.Currency.Name;
account.PriceTypeName = account.DisplayPriceType.Name;
return account;
}
Итак, мой вопрос, есть ли способ присвоить значение из объединенной таблицы свойству частичного класса текущей таблицы? Я пытался использовать.
from a in dc.Accounts
where a.CompanyID == companyID
&& a.Archived == null
select new {
PriceTypeName = a.DisplayPriceType.Name})
но это, кажется, испортило мое SortExpression.
Любая помощь по этому вопросу будет высоко ценится, я понимаю, что это сложные вещи.
1 ответ
Это функциональное программирование. Mutating Account, выполнив задание, отсутствует. Создайте новый экземпляр нужной фигуры.
Шаг 1: объявите класс, имеющий форму желаемого результата:
public class QueryResult
{
public int CompanyID {get;set;}
public string CurrencyName {get;set;}
public string PriceTypeName {get;set;}
}
Шаг 2: спроецируйте в этот класс ваш запрос
from ...
where ...
select new QueryResult()
{
CompanyID = a.CompanyID,
CurrencyName = a.Currency.Name,
PriceTypeName = a.PriceType.Name
};
Шаг 3: Прибыль! (заказ по этому)
Генератор запросов будет использовать детали вашего типа QueryResult для создания предложения select с этой формой.