【问题标题】:Translate from lambda (method) syntax to query syntax (LINQ)从 lambda(方法)语法转换为查询语法 (LINQ)
【发布时间】:2014-03-29 06:50:37
【问题描述】:

如何翻译

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

【问题讨论】:

  • 总是可能的!但是您正在尝试将LINQ 转换为另一种形式的LINQ,而不是methods 语法。
  • 只是为了澄清您正在从 LINQ 方法语法转换为 LINQ 查询语法的术语。就像@Dmitry 说的那样,这总是可能的……有时具有挑战性,但绝对是可能的。
  • 谢谢,是的,我当然弄错了。抱歉 - 我更新了帖子
  • Resharper 在将 QUERY 语法转换为 METHOD 语法方面做得很好,反之亦然。

标签: c# linq lambda linq-method-syntax


【解决方案1】:

这不是一对一的转录,因为let 的工作方式(在let 之后您仍然可以访问xx),但会产生相同的结果:

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
                   };

【讨论】:

  • 非常感谢! :) 这是完美的工作。而且我以前从未见过“let”子句——它不在 Microsoft LINQ 示例中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多