2010-01-21 2 views
1

Это любопытный теоретический вопрос, Я смотрел код другого пользователя (ниже), и моим простым решением было создать экземпляр коллекции вне linq, но я могу догадаться, что будут случаи где я хочу создавать объекты внутри запроса и, возможно, только по выбору элементов. Вот упрощенный пример того, как это делается (плохо).Как создать экземпляр объекта в запросе linq

var pods = (from n in ids 
where new Node(Convert.ToInt32(n)).HasValue("propertyName") 
select new 
{ 
    Id = Convert.ToInt32(n), 
    Url = new Node(Convert.ToInt32(n)).Url, 
    Name = new Node(Convert.ToInt32(n)).Title() 
}).ToList(); 

Неприемлемое примечание: в этом случае конструктор узла получает данные из кеша памяти.

Как я могу улучшить этот пример, чтобы создавать экземпляр каждого объекта только с помощью linq?

Cheers. Мюррей.

ответ

4

Используйте let статью так:

var pods = (
    from n in ids 
    let id = Convert.ToInt32(n) 
    let node = new Node(id) 
    where node.HasValue("propertyName") 
    select new 
    { 
     Id = id, 
     Url = node.Url, 
     Name = node.Title() 
    } 
).ToList(); 

Для получения дополнительной информации см let clause (C# Reference):

В выражении запроса, иногда полезно хранить результат суб- чтобы использовать его в следующих статьях: . Вы можете сделать это с ключевым словом let, которое создает новую переменную диапазона и инициализирует ее с результатом выражения . После инициализации со значением переменная диапазона не может использоваться для . Сохраняйте другое значение. Однако, если переменная диапазона содержит запрашиваемый тип, может быть запрошена.

+0

Спасибо, прост. Мои навыки google позволили мне и переполнение стека подняли меня :-) – Myster

Смежные вопросы