Перевести с синтаксиса лямбда (метода) на синтаксис запроса (LINQ)

Как можно перевести

var vehiclequery = db.position
    .GroupBy(c => c.device_id)
    .Select(g => g.OrderByDescending(c => c.sendtime).FirstOrDefault())
    .Select(c => new myPosition()                                                          
    {
        battery_percentage = c.battery_percentage,
        device_id = c.device_id,
        latitude = c.latitude,
        longitude = c.longitude,
        speed = c.speed,
        sendtime = c.sendtime
    });

запросить синтаксис? Теперь у меня есть что-то глупое, и я понятия не имею, как заставить это работать. Это как то так?

var vehiclequery = from dPosition in db.position
                   group dPosition by dPosition.device_id into xx
                   select new
                   {
                       device_id = xx.device_id
                   };

Я знаю, что чего-то не хватает, но я застрял на этом этапе. Я попробовал инструмент, рекомендованный здесь в стеке - http://www.linqpad.net/, но это только переводит синтаксис запроса в синтаксис метода.

Спасибо за любую помощь или руководство, как сделать эту работу. Некоторые полезные справочные страницы также будут очень полезны, сейчас я использую только http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

1 ответ

Решение

Это не транскрипция 1-к-1, из-за того, как let работает (у вас еще есть доступ к xx после let), но даст те же результаты:

var vehiclequery = from dPosition in db.position
                   group dPosition by dPosition.device_id into xx
                   let c = xx.OrderByDescending(x => x.sendtime).FirstOrDefault()
                   select new
                   {
                       battery_percentage = c.battery_percentage,
                       device_id = c.device_id,
                       latitude = c.latitude,
                       longitude = c.longitude,
                       speed = c.speed,
                       sendtime = c.sendtime
                   };

или с подзапросом в качестве синтаксического запроса:

var vehiclequery = from dPosition in db.position
                   group dPosition by dPosition.device_id into xx
                   let c = (from x in xx
                            orderby x.sendtime desc
                            select x).FirstOrDefault()
                   select new
                   {
                       battery_percentage = c.battery_percentage,
                       device_id = c.device_id,
                       latitude = c.latitude,
                       longitude = c.longitude,
                       speed = c.speed,
                       sendtime = c.sendtime
                   };
Другие вопросы по тегам