GridView ObjectDataSource LINQ Пейджинг и сортировка с использованием запроса нескольких таблиц - PullRequest
2 голосов
/ 16 июня 2010

Я пытаюсь создать источник данных объекта разбивки на страницы и сортировки, который перед выполнением возвращает все результаты, затем сортирует эти результаты перед фильтрацией, а затем использует методы 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 Ответ

1 голос
/ 16 июня 2010

Это функциональное программирование. 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 с этой формой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...