【问题标题】:sql and linq querysql和linq查询
【发布时间】:2010-03-31 21:03:24
【问题描述】:

数据库有表格照片和照片相册。我需要一个查询来选择所有相册,并且每个相册中只选择一张照片。我需要这个查询的 SQL 和 LINQ 版本。提前致谢。

【问题讨论】:

  • 你想要每张相册中的哪张照片?
  • 现在任何照片..稍后我将编辑表格照片,使其具有“相册封面”字段,但现在我需要随机一张
  • 您选择的查询效率低下,因为它必须运行不同的查询才能找到从 PhotoAlbums 返回的每一行的照片。最好使用派生表并将 PhotoAlbums 加入其中。
  • 我可能同意在应用程序中不建议使用 KM 子查询,因为它会在获取数据时降低性能。在这种情况下,更好的方法是在“PhotoAlbums”表中创建一个名为“DefaultPhoto”的新列,并将默认照片 id 放入其中,这将进行直接选择查询而无需任何连接,从而提高性能和可维护性。
  • 我同意你的观点,这绝对是一个不那么痛苦的解决方案。

标签: sql linq linq-to-sql


【解决方案1】:

在 Linq 中我不是很有经验,所以我只会给出 SQL Server 查询

SELECT a.*,b.MyPhoto FROM PhotoAlbums a,(SELECT Top 1 myPhoto from Photos Where AlbumID = a.ID) b

或者这个

SELECT a.AlbumID, a.Title, a.Date, (SELECT TOP (1) c.PhotoID FROM Photos c WHERE(c.AlbumID = a.AlbumID)) AS PhotoID FROM PhotoAlbums as a

【讨论】:

    【解决方案2】:

    如果表格是这样的:

    PhotoAlbums
    AlbumID    PK
    ...
    
    Photos
    PhotoID    PK
    AlbumID    FK
    Photo
    ...
    

    这是 SQL 查询:

    SELECT
        a.*,p.Photo 
        FROM PhotoAlbums a
            LEFT OUTER JOIN (SELECT
                                 AlbumID,MIN(PhotoID) AS MinPhotoID
                                 FROM Photos
                                 GROUP BY AlbumID
                            ) dt ON a.AlbumID=dt.AlbumID
            LEFT OUTER JOIN Photos p ON dt.MinPhotoID=p.PhotoID
    

    工作示例:

    DECLARE @PhotoAlbums table (AlbumID  int)
    INSERT @PhotoAlbums VALUES (1)
    INSERT @PhotoAlbums VALUES (2)
    INSERT @PhotoAlbums VALUES (3)
    
    DECLARE @Photos table (PhotoID int,AlbumID int, Photo varchar(10))
    INSERT @Photos VALUES (1,1,'A')
    INSERT @Photos VALUES (2,1,'B')
    INSERT @Photos VALUES (3,1,'C')
    INSERT @Photos VALUES (4,2,'AA')
    INSERT @Photos VALUES (5,3,'AAA')
    INSERT @Photos VALUES (6,3,'BBB')
    
    SELECT
        a.*,p.Photo 
        FROM @PhotoAlbums a
            LEFT OUTER JOIN (SELECT
                                 AlbumID,MIN(PhotoID) AS MinPhotoID
                                 FROM @Photos
                                 GROUP BY AlbumID
                            ) dt ON a.AlbumID=dt.AlbumID
            LEFT OUTER JOIN @Photos p ON dt.MinPhotoID=p.PhotoID
    

    输出:

    AlbumID     Photo
    ----------- ----------
    1           A
    2           AA
    3           AAA
    
    (3 row(s) affected)
    

    【讨论】:

    • hmmm... 当我尝试执行您和 Kronass 的查询时,VS2008 格式化查询然后返回错误。 MySQL 和 MSSQL 的 SQL 是否相同?
    • 是的,这些表格就像你假设的那样
    • 如果我单击执行,错误如下:“GROUP BY 子句中的错误。无法解析查询文本。”如果我单击验证语法,错误是:“'a' 附近的语法不正确”
    • 查看最新编辑,我在这里错过了ON) dt ON a.AlbumID=,我还添加了一个工作示例。
    • 现在可以使用了,非常感谢。对我来说理解起来有点复杂......“dt”代表什么?我想它代表照片表,但我习惯用'AS'来制作表达式的别名。
    【解决方案3】:

    Linq 查询可能是这样的:

    from album in context.PhotoAlbums
    from photo in album.Photos.Take(1).DefaultIfEmpty()
    select new
       {
            Album = album,
            Photo = photo
       }
    

    【讨论】:

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