2014-03-30 58 views
0

我正在寫時間表應用程序(Silverlight),我完全停留在獲取linq查詢工作。我是LINQ的網絡工程師,我只是讀了一些Linq書籍,包括Linq to Objects,linq to SQl和linq to Entities。(我假設,但我不能100%確定後者是Lightswitch使用)。我計劃研究更多的Linq,但只需要讓這個查詢工作。Lightswitch 2013 Linq查詢獲取最小值

所以我有一個名爲項目的實體,其中列出作業中的每一個項目,它的序列號

所以:Job.ID INT,ID INT,長期的SerialNo

我也有一個時間表實體包含轉移日期,工作沒有開始和結束序列號產生

所以Job.ID INT,ShiftDate日期,移INT,StartNo長,EndNo長

當用戶從自動完成框中選擇一個工作,我想爲此查找MAX(SerialNo)在時間表實體中工作。如果這是空的(即沒有產生),我想從項目實體查找該作業的MIN(SerialNo)(即,它們應該產生的第一個序列號是什麼)

我意識到我需要第一個或默認並且需要指定項目中的MIN(SerialNo)作爲默認值。

我的時間表屏幕採用TimesheetProperty,因爲它的數據源

我嘗試以下只是爲了讓從時間表實體MAX(的SerialNo):

var maxSerialNo = 
      (from ts in this.DataWorkspace.SQLData.Timesheets 
      where ts.Job.ID == this.TimesheetProperty.Job.ID 
      select ts.StartNo).Min(); 

,但我得到了以下錯誤:

實例參數:無法從「Microsoft.LightSwitch.IDataServiceQueryable」轉換爲「System.Collections.Generic.IEnumerable

'Microsoft.LightSwitch.IDataServiceQueryable'不包含'Min'的定義,並且最佳擴展方法重載'System.Linq.Enumerable.Min(System.Collections.Generic.IEnumerable)'有一些無效參數

I也不知道爲什麼我不能用這個:

var maxSerialNo = this.DataWorkspace.SQLData.Timesheets.Min(ts => ts.StartNo); 

任何人都可以點我在正確的方向?

感謝

馬克

回答

1

IDataServiceQueryable不支持全套LINQ運營商像IEnumerable了。

IDataServiceQueryable - 這是一個特定的LightSwitch類型,它使有限的一組「LINQ樣」運營商是遠程能夠在中間層,並最終發佈到數據庫服務器。該接口是LightSwitch查詢編程模型的核心。 IDataServiceQueryable有一個成員來執行該查詢,該查詢返回IEnumerable的結果。[Reference]

可行的辦法是,先執行查詢調用.ToList()得到IEnumerable類型的集合,然後你可以調用.Min()針對第一查詢結果。但是,如果您有大量數據,那麼這不是個好主意,因爲.ToList()將檢索與查詢匹配的所有數據,並在客戶端進行進一步處理,效率低下。

另一種方法是,僅使用IDataServiceQueryable支持的運算符更改查詢,以避免向客戶端檢索不必要的數據。例如,爲了獲得最小StartNo你可以嘗試使用orderby descending然後得到的,而不是使用.Min()運營商的第一個數據:

var minStartNo = 
      (
       from ts in this.DataWorkspace.SQLData.Timesheets 
       where ts.Job.ID == this.TimesheetProperty.Job.ID 
       orderby ts.StartNo descending select ts 
      ).FirstOrDefault();