2011-10-12 34 views
2

我有一個WCF服務的代碼C#代碼:LINQ到SQL - 以不工作

using (DataClasses1DataContext db = new DataClasses1DataContext()) 
     { 
      var members = from member in db.Stops_edited_smalls.Take(25) 
          where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05 
          && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05 
          select member; 
      return members.ToList(); 
     } 

具有:

.Take(25) 

如上,沒有返回retults。爲什麼這樣? (沒有.Take(25)就可以正常工作)

回答

7

因爲在過濾where子句之前,而不是之後,你正在取前25個。這25條記錄都不匹配where子句。

如果你只想要第25分的結果,你應該將呼叫採取():作爲賈斯汀說

var members = (from member in db.Stops_edited_smalls 
       where Math.Abs(Convert.ToDouble(member.Latitude) 
        - curLatitutde) < 0.05 
       && Math.Abs(Convert.ToDouble(member.Longitude) 
        - curLongitude) < 0.05 
       select member).Take(25); 
+0

啊,完美,那就是那個!謝謝。 –

+0

@丹不要忘記將此標記爲接受的答案。 – pstrjds

+0

將在6分鐘內做;-) –

5

,你有你的Take錯了地方。這就像說「找到字典中的前25個單詞,然後過濾掉任何不以B開頭的單詞」。這不是你如何找到的第一個25個字與B.你開始可能只是想:

using (DataClasses1DataContext db = new DataClasses1DataContext()) 
{ 
    var members = 
     from member in db.Stops_edited_smalls 
     where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05 
     && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05 
     select member; 

    return members.Take(25).ToList(); 
} 

我更願意把Take呼叫分別到查詢表達式,只是可讀性的原因。或者將工作,並且這確實在數據庫中執行「僅前25個值」,不在本地。

鑑於您只需要「第一個」25行,您應該指定一個排序,例如,

var members = 
     from member in db.Stops_edited_smalls 
     where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05 
     && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05 
     orderby member.Latitude 
     select member; 

...除了使用你真正想要命令的任何屬性。

+0

偉大的解釋喬恩!有一個upvote。 –

+0

啊!很有意思。特別是表示「確實在數據庫中執行'僅僅前25個值'的位,而不是本地位。」我希望我以前知道這件事。 –