2011-10-12 33 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个值'的位,而不是本地位。”我希望我以前知道这件事。 –