2013-07-04 5 views
3

Можно ли ссылаться на свойство текущего объекта в выражении Select выражения лямбда в Linq?Ссылка на текущий объект в выражении лямбда

Пример:

... 
.Select(s => new { 
        Date = s.Date.ToString("yyyy-MM-dd"), 
        Time = s.Time.ToString("h':'m"), 
        DateTime = s.Date.ToString("yyyy/MM/dd") +"-"+ s.Time.ToString("h':'m"), 
        Temperature = s.Temperature, 
        Humidity = s.Humidity, 
        Device = s.Device.Name, 
        Message = s.Message 
       }) 

Я хотел бы заменить двойной вызов функции ToString с помощью ссылки на определенную ранее Date и Time свойств.

ответ

4

Вы можете использовать функцию лямбда, а не лямбда-выражения:

.Select(s => { 
    var d = s.Date; 
    var t = s.Time; 
    return new { 
       Date = d.ToString("yyyy-MM-dd"), 
       Time = t.ToString("h':'m"), 
       DateTime = d.ToString("yyyy/MM/dd") +"-"+ t.ToString("h':'m"), 
       // ... 
      }) 

Примечание дополнительный набор { ... } фигурных скобок (что позволяет иметь локальные переменные в лямбда) и return.

6

Если вы переключитесь на синтаксис запроса LINQ (вместо синтаксиса метода), вы можете использовать let keyword ", чтобы сохранить результат подвыражения, чтобы использовать его в последующих предложениях".

from s in source 
let dateStr = s.Date.ToString("yyyy-MM-dd") 
let timeStr = s.Time.ToString("h':'m") 
select new { 
    Date = dateStr, 
    Time = timeStr, 
    DateTime = dateStr + "-" + timeStr, 
    Temperature = s.Temperature, 
    Humidity = s.Humidity, 
    Device = s.Device.Name, 
    Message = s.Message 
} 
+0

Этот код напоминает код SML! – Star

+0

@Star: Действительно; LINQ имеет сильные ассоциации с функциональными языками. – Douglas

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