none
如何透過Linq 找出最後一筆資料?? RRS feed

  • 問題

  • 各位好

    如題 如果我想要利用linq to sql 找出資料庫中的最後一筆該怎麼做呢??

    我想更新最後一筆Change_Time=null的資料
    寫法如下:
    Current_Recipe_Change updateChangeTime = (from s in dbconn.Current_Recipe_Change
                                                                      where s.Change_Time==null
                                                                      select s).Last();
                                updateChangeTime.Change_Time = dtChangeTime;
                                dbconn.SubmitChanges();

    但會出現"不支援查詢運算子 'Last'。"
    請各位不吝指教 謝謝
    2009年8月20日 上午 10:13

解答

  • 受限於SQL語法
    LINQ to SQL與Entity Framework都不支援LINQ Last()方法.
    原因很簡單
    你試著用撰寫取得最後一筆資料的SQL語法就會發現,因SQL語法根本沒有直接取得最後一筆資料(這邊指ANSI SQL標準),唯一的辦法就是靠ORDER BY .. DESC後用TOP 1取得第一筆.
    其實這類問題也發生在其他語法中,像Skip於SQL中無法直接實現,所以在EF中強制使用Skip前必須一定要有Order By.
    所以你的問題可以改用
    ....).Last() 修正為 ...).OrderByDescending(columnName).Take(1).

    像EF MSDN有提供支援與不支援的LINQ方法可查詢
    http://msdn.microsoft.com/zh-tw/library/bb738550.aspx

    LINQ to SQL應該也有你可以查看看.

    • 已標示為解答 Jude13 2009年8月21日 上午 02:45
    2009年8月21日 上午 12:27

所有回覆

  • 不可能沒 Last??????????
    你有沒有 using System.Linq;
    沒有 Last,就沒有  First.OrderBy 就沒用了. 該不會用  OrderBy Desc  然後配  Take(1) 吧?
    不可能!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    2009年8月20日 上午 10:24
  • 受限於SQL語法
    LINQ to SQL與Entity Framework都不支援LINQ Last()方法.
    原因很簡單
    你試著用撰寫取得最後一筆資料的SQL語法就會發現,因SQL語法根本沒有直接取得最後一筆資料(這邊指ANSI SQL標準),唯一的辦法就是靠ORDER BY .. DESC後用TOP 1取得第一筆.
    其實這類問題也發生在其他語法中,像Skip於SQL中無法直接實現,所以在EF中強制使用Skip前必須一定要有Order By.
    所以你的問題可以改用
    ....).Last() 修正為 ...).OrderByDescending(columnName).Take(1).

    像EF MSDN有提供支援與不支援的LINQ方法可查詢
    http://msdn.microsoft.com/zh-tw/library/bb738550.aspx

    LINQ to SQL應該也有你可以查看看.

    • 已標示為解答 Jude13 2009年8月21日 上午 02:45
    2009年8月21日 上午 12:27
  • to 好說:

    如果沒有using System.Linq的話再dbconn.Current_Recipe_Change就會出Exception了
    或許是寫法不對,請問大家取最後一筆都是怎麼寫的呢??

    謝謝
    2009年8月21日 上午 12:38
  • 不可能沒有吧!
    我用Linq To SQL 用三個月.
    現在用ADO.NET Data Service.
    我用ADO.NET Data Service 就可用 First,Last了.而ADO.NET Data Service 限制比 Linq To SQL 多很多.
    我是想讓資料傳出內網才會改新的方式.所以再看看有無人有新的解法.(我的映像是直接取用)

    2009年8月21日 上午 12:45
  • 把其它Code貼上來.
    沒有System.Linq
    dbconn.Current_Recipe_Change 可以用.
    Last.First.Where.....不可用.這個叫做方法延伸技術.
    你的List<T> 沒 System.Linq 還是可用一般方式操作.加入System.Linq 就能用 Linq 表達式.
    妳的Table 有沒有設PK

    2009年8月21日 上午 07:55