Как создать объект в запросе linq - PullRequest
1 голос
/ 21 января 2010

Это своего рода теоретический вопрос, Я искал чужой код (ниже), и мое простое решение состояло в том, чтобы создать экземпляр коллекции вне 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();

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

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

Приветствия. Мюррей.

1 Ответ

4 голосов
/ 21 января 2010

Используйте предложение 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 (C # Reference) :

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

...