2011-03-16 63 views
2

我的代碼
我需要抓住底部元素(最近)條目到我的數據庫,看看它是否超過1小時前,ObservationTime的類型是約會時間。對於我的var mWeathers,我不斷收到一個錯誤,指出「序列包含多個元素」。我認爲這與我通過降序的方式有關,但我無法弄清楚。由於LINQ C#數據查詢抓取數據庫的底部元素,並檢查它

[OperationContract] 
    public bool LeastOneHour() 
    { 

     DataClassesDBDataContext db = new DataClassesDBDataContext(); 
     var mWeathers = (from weathertable in db.WeatherTables 
         orderby weathertable.ObservationTime descending 
         select weathertable.ObservationTime).Single(); 
     DateTime lastTime = Convert.ToDateTime(mWeathers).AddHours(1); 
     if (lastTime <= DateTime.Now) 
      return true; 
     else 
      return false; 
    } 

回答

3

Single()說,有必須是結果一個元素,如果有不止一個,拋出異常。你可能要找的是First()FirstOrDefault()如果有機會將根本沒有結果(在這種情況下返回null)

如果你可以保證總會有一個元素,試試這個:

DateTime lastDate = db.WeatherTables.OrderByDescending (w => w.ObservationTime).Select(w => w.ObservationTime).First(); 

return lastDate.AddHours(1) <= DateTime.Now; 

否則像

DateTime? lastDate = db.WeatherTables.OrderByDescending (w => w.ObservationTime).Select(w => w.ObservationTime).FirstOrDefault(); 

return lastDate.HasValue ? lastDate.AddHours(1) <= DateTime.Now : false; 

假設當然ObservationDate的聲明爲日期時間?

+0

是否w => w反轉表?對不起,我不喜歡C#和Silverlight,但它的作品感謝一羣 – Sam

+0

?? '.OrderByDescending(w => w.ObservationTime)'按ObservationTime按降序對錶進行排序。不知道你的意思是 –

4

由於您的查詢返回一個以上的元素,你想從這些結果採取的第一個元素,使用First()代替Single()

var mWeathers = (from weathertable in db.WeatherTables 
       orderby weathertable.ObservationTime descending 
       select weathertable.ObservationTime).First(); 

或者,如果有一個機會,查詢不會產生任何結果,你應該使用FirstOrDefault()

var mWeathers = (from weathertable in db.WeatherTables 
       orderby weathertable.ObservationTime descending 
       select weathertable.ObservationTime).FirstOrDefault(); 

如果你不反對做一些其他的變化,你可以使你的代碼更清潔和更簡潔:

var mWeathers = db.WeatherTables 
        .OrderByDescending(w => w.ObservationTime) 
        .First(); // or FirstOrDefault() 

return Convert.ToDateTime(mWeathers).AddHours(1) <= DateTime.Now;   
+0

+1使用FirstOrDefault – Geoff

4

還有其他的(完全有效)回答您已經給過,你可能要考慮:

DateTime lastTime = db.WeatherTables.Max(table => table.ObservationTime); 

DateTime? lastTime = db.WeatherTables.Max<DateTime?>(t => t.ObservationTime); 

後一種形式可以應對與一個空的表(第一個不會)。在LINQ to Objects中這樣可以,但是我總是毫不猶豫的說工作在LINQ to SQL中,而沒有先嚐試它:)

+0

加 - 我認爲它後來在池塘裏。我想我會去找別的事情要做,直到英國夜幕降臨:) +1雖然 - 這是光滑的 –

+0

@亞當:我不會抱怨,你的答案被接受:) –

+0

:) - 沒有投訴 - 在你的第212頁書。挑選一些精彩的技巧;永遠不會想象使用像你所顯示的合併運算符。 –