Повторное использование выражения в предложении Linq select (формат запроса) - PullRequest
3 голосов
/ 16 июля 2010

У меня есть выражение, которое преобразует один тип объекта в другой тип.Выражение выглядит следующим образом:

public Expression<Func<SQLRepository.ActionType, Model.ActionType>> DBActionTypeToActionType =
(SQLRepository.ActionType at) => new Model.ActionType()
{
    ID = at.OID,
    DisplayName = at.DisplayName
};

Я могу использовать выражение следующим образом:

var linq = (from at in dc.SQLRepositoryDC.ActionTypes select at).Select(DBActionTypeToActionType);

Но я бы хотел использовать его так:

var linq = (from at in dc.SQLRepositoryDC.ActionTypes select DBActionTypeToActionType.Compile().Invoke(at));

Я искал пару дней и могу найти ссылки на это в предложении «Где».Кажется, что если я могу использовать вызовы функций для этого, это должно быть возможно с использованием синтаксиса запроса.

Причина, по которой важно использовать синтаксис запроса, состоит в том, что некоторые объекты, которыевыбираются, состоят из множества подобъектов, и при попытке связать их все преобразования вместе с нотацией функции будет намного сложнее написать и поддерживать.

1 Ответ

4 голосов
/ 16 июля 2010

Кажется, что если я могу использовать вызовы функций для этого, это должно быть возможно с использованием синтаксиса запроса.

Это не так.Обозначение запроса всегда проходит через лямбда-выражение.Например,

from x in y select z

заканчивается как

y.Select(x => z)

Это означает, что если у вас уже есть дерево выражений, которое вы хотите передать непосредственно в качестве аргумента Select, вы можетене используйте выражения запроса, потому что есть дополнительный уровень косвенности.

Теперь доступные параметры зависят от того, где вам нужно применить предопределенное выражение.Вы всегда можете использовать его в источнике, а затем продолжить с запросом:

var query = from foo in dc.ActionTypes.Select(DBActionTypeToActionType)
            where foo.Stuff
            select foo.Other;

Или использовать его в конце очень просто:

var query = (from bar in dc.ActionTypes
             where bar.Stuff
             select bar).Select(DBActionTypeToActionType);

Помогает ли это вообще?

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