代码之家  ›  专栏  ›  技术社区  ›  Jake Petroules

如何将SQL查询限制为最多返回一个查询?

  •  0
  • Jake Petroules  · 技术社区  · 14 年前

    我的数据库中有一个表示软件版本的表;模式的相关列如下所示:

    ProductID   int
    PlatformID  tinyint
    Date        datetime
    

    所有列都不是空的,并且前两列也有一个唯一的键。

    我想建立一个查询(使用LINQ),返回每个平台(PlatformID)的最新版本(例如日期), 但每个平台不超过一条记录(PlatformID) ,并按日期降序排序。

    我该怎么做?


    var product = ...;
    
    var latestReleases = product.Releases
        .GroupBy(p => p.PlatformID)
        .Select(group => group.OrderByDescending(p => p.Date).FirstOrDefault())
        .OrderByDescending(release => release.Date)
    

    foreach (var release in latestReleases)
    {
        Console.WriteLine("The latest release of MyProduct for {0} is {1}.",
            release.PlatformID, // of course this would be a string in real code ;)
            release.Version);
    }
    
    4 回复  |  直到 14 年前
        1
  •  2
  •   Timwi    14 年前

    我认为以下代码满足了您的要求:

    var latestProducts = db.Releases
        .GroupBy(p => p.PlatformID)
        .Select(grp => new {
            Platform = grp.Key,
            Latest = grp.OrderByDescending(p => p.Date).FirstOrDefault()
        })
        .OrderByDescending(entry => entry.Latest.Date);
    
    foreach (var entry in latestProducts)
    {
        Console.WriteLine("The latest product for platform {0} is {1}.",
            entry.Platform,
            entry.Latest.ProductID);
    }
    

    • 首先,把所有的产品都拿走
    • 按共同平台分组
    • 在每个组中,按日期降序排列该组中的产品,然后选择第一个(即日期最晚的产品)
    • 按日期降序排列此对象列表。
        2
  •  0
  •   Fyodor Soikin    14 年前
                    from plat in 
                    (
                        from p in Products
                        group p by p.PlatformID
                    )
    
                    let latestRelease = 
                    (
                        from p in plat
                        orderby p.Date descending
                        select p
                    ).FirstOrDefault()
    
                    where latestRelease != null
    
                    select new 
                    {
                        PlatformID = plat.Key,
                        LatestProductID = latestRelease.ProductID,
                        LatestDate = latestRelease.Date
                    }
    
        3
  •  0
  •   Cheng Chen    14 年前

    单行代码:

    IEnumerable<Product> products = AllProducts.GroupBy(p => p.PlatformID, 
        (pid, source) => source.Where(p => p.PlatformID == pid).OrderByDescending(p => p.Date).FirstOrDefault());
    
        4
  •  -2
  •   Matt Greer    14 年前

    如果您使用的是LINQ到实体、LINQ到SQL等,那么只需使用 First() FirstOrDefault() ,它们将足够聪明,将查询限制为1。如果你想更明确一点,你可以加上 Take(1) 你的问题。