Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

суббота, 31 октября 2009 г.

Выполнение произвольной промежуточной операции над данными внутривыражения LINQ

Первый абзац это теория и вступление, переходите к следующему, кто в теме
При написании LINQ постоянно появляется желание выполнить промежуточную операцию над данными. По науке это не правильно, т.к. пока производительность не страдает каждый цикл по данным должен служить отдельной роли. Ведь LINQ это и есть цикл, определенные на языке запросов. Но, тоже по науке :), код должен быть очевиден и однотипные или связанные операции сгруппированы.
Сразу ответ на тему поста:
Я использую выражение LINQ “let” для написание промежуточной операции, но с некоторым простым ухищрением. Вот пример:
var orgUnits = (
    from el in orgUnitsDict.Values
    // в промежуточной операции отсортируем элементы в дочернем объекте
    let dummy = el.Phones = el.Phones.OrderBy(p => p.PhoneStr).ToList()    orderby el.ParentId,
    el.IsGroup descending,
    el.Name
    select el
).ToList();
Описание:
В этом выражении из словаря объектов я получаю отсортированный список этих же объектов, но попутно, у меня стоит задача в каждом объекте отсортировать дочернюю коллекцию в свойстве Phones.
Директива let позволяет это сделать. А поскольку в директиве let обязательно должна создаваться промежуточная переменная, то я использую как затычку бесполезную переменную dummy, которая больше нигде не используется в запросе.
Также эту строчку
let dummy = el.Phones = el.Phones.OrderBy(p => p.PhoneStr).ToList()
вы можете заменить следующей
let dummy = el.Phones = MyMethod(el.Phones)
или даже так
let dummy = MyMethod(el)
т.е. можете применять свой произвольный метод для выолнения промежуточной операции,
главное, чтоб он хоть чего-нибудь возвращал.
Очень полезное образовательное надругательство над LINQ.
Веселых вам извратов, господа, если что, обращайтесь :).
Пожалуйста, если вы знаете другие подходы, то дайте знать. Там ссылочку киньте или напишите в комментариях.

Комментариев нет:

Отправить комментарий