2009-11-17 94 views
2

我正在訪問通過使用LINQ to SQL自動生成的數據上下文對象。 SQL數據庫是一個SQL Server 2000框。我正在使用的類是SQL視圖。我有一個說法是與此類似:LINQ,Skip,OrderBy和SQL Server 2000

query = _context.OrderDetails 
    .Where(w => w.Product == "TEST") 
    .OrderBy(o => o.DateCompleted) 
    .ThenBy(t => t.LineItemId) 
    .Skip(startRowIndex) 
    .Take(maximumRows); 

然而,當跳過的價值是什麼,但0,我得到這個錯誤:

此提供程序支持跳過()僅在訂購查詢返回包含所有標識列的實體或投影,其中查詢是單表(非連接)查詢,或者是Distinct,Except,Intersect或Union(不是Concat)操作。

我認爲DateCompleted和LineItemId之間的行將是唯一的,但隨後會再次彈出。這是否與這是一種觀點有關?如果是這樣,我怎樣才能繞過這個問題?

回答

2

我相信它所說的是,如果您在OrderDetails表上沒有標識列,那麼您需要在其中添加.Distinct()或提到的其他操作符之一。

+0

我認爲這工作。但不知道。好建議! – 2009-11-17 22:11:50

+0

這確實奏效。尼斯「破解」強制在LINQ查詢中使用Distinct()。 – 2009-11-18 20:00:32

4

SQL Server 2000中有一些Linq爲了執行Skip和Take功能而需要解決的「缺陷」。這大大限制了您可以在SQL Server 2000中使用這些功能的條件。

請確保您包含_context.OrderDetails中的標識列,並且您履行了錯誤消息中所述的所有其他條件。

當然,您可以隨時升級到SQL Server 2005或更高版本。 :)

更多的信息在這裏:http://msdn.microsoft.com/en-us/library/bb386988.aspx

+0

我希望這個錯誤對於它究竟是哪個問題會有更多的描述。我不得不多鑽一下。 – 2009-11-17 21:00:54

+1

從2000年到2005年的這種分離讓我感動。我在本地和測試服務器上開發/測試了2008 R2,但是針對2000個實例進行生產。正如我在這個線程上的表示,在我的本地一切工作正常,但部署後相同的功能是DOA。在我的情況下,在我的對象(在DBML中)上添加一個PK解決了問題 - 幸運的是,不需要更改「我的代碼」。 – mattezell 2011-06-22 18:23:18