【问题标题】:How can I write my SQL query in LINQ?如何在 LINQ 中编写我的 SQL 查询?
【发布时间】:2009-03-20 04:18:34
【问题描述】:

我有一张像这样的桌子。查询需要返回每个位置的最后日期条目。我将如何用 SQL 和 LINQ 编写这个?

Id  Location        Salary  Date
1   Los Angeles     $1500   Jan-05-1999 
2   San Diego       $250    Jan-07-1999 
3   Los Angeles     $300    Jan-08-1999
4   Boston          $700    Jan-08-1999
5   Los Angeles     $300    Jan-08-1999

结果是:

2   San Diego       $250    Jan-07-1999
4   Boston          $700    Jan-08-1999
5   Los Angeles     $300    Jan-08-1999

【问题讨论】:

  • 您是否还希望结果中包含 $ 金额?
  • 是的,它只是一个 nvarchar 字段

标签: sql linq


【解决方案1】:

请记住,我对链接还很陌生,我认为这不是最好的方法:

var collection = from d in <TABLE> select d;
collection = collection.GroupBy(x => x.Date).Select(x => x.Last());

基本上只是按日期分组并选择最后一个。我想不出在 LINQ 命令中执行此操作的好方法,所以我只选择了所有行 - 有人知道合并这些行吗?

【讨论】:

  • 是的,您可以在第 2 行简单地将 collection 替换为 TABLE。
【解决方案2】:

如果您的日期包括时间,那么您可以:

var locations = 
   from l in mycontext.Locations
   where l.Date = mycontext.Locations
         .Where(l2=>l.Location == l2.Location)
         .Max(l2.Date)
   select l;

或者,假设 ID 是一个身份,并且记录在发生时插入到表中(您的示例似乎暗示了这一点),您可以这样做:

var locations = 
   from l in mycontext.Locations
   where l.ID = mycontext.Locations
         .Where(l2=>l.Location == l2.Location)
         .Max(l2.ID)
   select l;

【讨论】:

    【解决方案3】:

    @Bobby Shaftoe

    我相信他正在寻找最新条目,而不是每个位置的最新日期。如果我的假设是正确的,它会更像

    SELECT max(ID),location,date
    FROM tablename
    GROUP BY location
    

    【讨论】:

    • 嗯,他说的是日期输入。但是,如果他的数据是一致的,那么看起来可能是同一件事。但我坚持我所写的问题,不过你可能是对的。
    • 哦,这个有错误。数据库会抱怨“日期”不在 group by 子句或聚合函数中。
    • 他在这里得到了他期望的结果——这是整行。不确定它最初是否存在。
    【解决方案4】:

    要获取每个位置的最大日期的整行,我认为 SQL 是:

    SELECT t1.Id, t1.Location, t1.Salary, t1.Date
    FROM YourTable t1, 
        (SELECT Location, MAX(Date) AS MaxDate
        FROM YourTable
        GROUP BY Location) t2
    WHERE t1.Location = t2.Location
    AND t1.Date = t2.MaxDate
    

    如果我错了,请纠正我!

    【讨论】:

    • 你会如何在 LINQ 中编写这个?
    • 是的,很好的问题 :) 简短的回答是我对 Linq 不够了解。我知道 linq 在某种程度上倾向于镜像 sql,但我不知道用于分组和加入的确切语法(如果有的话)。您可能必须效仿 Steve Willard 的示例 - 选择所有内容并使用表达式将其缩减。
    【解决方案5】:

    实际上,如果我正确阅读了这个问题,这并不是那么简单。因为 Los Angeles 在 Max date 上有 2 个条目,所以似乎还有一条进一步的规则,即在这种情况下应该选择最大 ID。

    在这种情况下,SQL 会变得更复杂一些,需要 2 个分组......

    select id, location, salary, date from 
    locations where id in
    (select  max(id) as MaxID
    from locations where date in (
    Select Max(Date) as MaxDate from Locations group by Location)
    Group by location)
    

    对应的 Linq 查询,也需要 2 个分组...

      var qry = from a in locations
                group a by a.Location into grp
                from b in grp
                where b.Date == grp.Max(o => o.Date)
                group b by b.Location into grp2
                from c in grp2
                where c.ID == grp2.Max(obj => obj.ID)
                orderby c.ID
                select c;
    

    【讨论】:

      【解决方案6】:
      SELECT location, max(date)
      
      FROM yourtable
      
      GROUP BY location
      

      编辑:我没有看到要求的结果或不确定它最初是否存在:

      SELECT yourtable.id, yourtable.location, yourtable.salary, yourtable.date
      FROM yourtable INNER JOIN
        (SELECT yourtable.location, MAX(yourtable.date) as thedate
         FROM yourtable
         GROUP BY yourtable.location) AS MYRESULT 
         on MYRESULT.thedate = yourtable.date  
            AND MYRESULT.location = yourtable.location
      

      虽然还没有测试过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多