首页 新闻 会员 周边

SQL转换成LINQ

0
悬赏园豆:10 [已解决问题] 解决于 2011-09-08 10:11

已经一组经纬度数据(1W多条).   
现在输入一个经纬度,找一个离此点最近的点 
经度               纬度 
112.92248     28.17778 
112.92274     28.17356 
112.92089     28.1767 
112.90476     28.22937 
112.93131     28.23108 
112.92346     28.22899 
112.92125     28.22906 
112.91535     28.22881 
112.90412     28.22702 
112.90625     28.22825 
112.91412     28.22786 
112.91149     28.22641 
112.9106     28.22407 
112.90894     28.21994 
112.91038     28.22209 
112.91143     28.22254 
112.91611     28.22273 
112.9229     28.22221 
112.92581     28.22132 
112.92729     28.2212 
112.9289     28.21983 
112.94791     28.18694 
112.94635     28.1873 
112.94581     28.18741 

 

这些数据,其实就是一个长沙市区的经纬度... 

现输入一个点的经纬度,匹配一个数据库中已有经纬度数据最接近的点

 

我现在已经知道SQL语句怎么写了,比如:

 

到112.95     28.18最近的 

select   top   1   *   from   tablename 
order   by   SQUARE(经度-112.95)+SQUARE(纬度-28.18) 

 

将上面的语句转换成LINQ怎么写呢????!

需要格局的主页 需要格局 | 老鸟四级 | 园豆:2145
提问于:2011-09-07 10:30
< >
分享
最佳答案
0

你好,

首先我先根据你的测试数据去建立好一个表环境

--先建立全局临时表,最后记得删掉
CREATE TABLE ##经纬度表 (
[经度] float not null,
[纬度] float not null
)

--导入你题目的测试数据
INSERT INTO ##经纬度表 (
[经度],
[纬度]
)
SELECT 112.92248 , 28.17778 UNION ALL
SELECT 112.92274 , 28.17356 UNION ALL
SELECT 112.92089 , 28.1767 UNION ALL
SELECT 112.90476 , 28.22937 UNION ALL
SELECT 112.93131 , 28.23108 UNION ALL
SELECT 112.92346 , 28.22899 UNION ALL
SELECT 112.92125 , 28.22906 UNION ALL
SELECT 112.91535 , 28.22881 UNION ALL
SELECT 112.90412 , 28.22702 UNION ALL
SELECT 112.90625 , 28.22825 UNION ALL
SELECT 112.91412 , 28.22786 UNION ALL
SELECT 112.91149 , 28.22641 UNION ALL
SELECT 112.9106 , 28.22407 UNION ALL
SELECT 112.90894 , 28.21994 UNION ALL
SELECT 112.91038 , 28.22209 UNION ALL
SELECT 112.91143 , 28.22254 UNION ALL
SELECT 112.91611 , 28.22273 UNION ALL
SELECT 112.9229 , 28.22221 UNION ALL
SELECT 112.92581 , 28.22132 UNION ALL
SELECT 112.92729 , 28.2212 UNION ALL
SELECT 112.9289 , 28.21983 UNION ALL
SELECT 112.94791 , 28.18694 UNION ALL
SELECT 112.94635 , 28.1873 UNION ALL
SELECT 112.94581 , 28.18741

--提示:你可以根据情况去建立聚集索引,这里我就不建了.
然后我在按照你提供的SQL去查询

SELECT TOP (1)
*
FROM ##经纬度表
ORDER BY
SQUARE(经度 - 112.95) + SQUARE(纬度 - 28.18)
结果集为:

经度                   纬度
112.94791     28.18694

然后我用LINQPad去查询,结果是一致的.附上LINQ代码和效果图

经纬度表s.OrderBy(m =>
Math.Pow(m.经度
- 112.95, 2.0)
+ Math.Pow(m.纬度 - 28.18, 2.0)
).FirstOrDefault()

生成的SQL如下

DECLARE @p0 Float = 112.95
DECLARE @p1 Float = 2
DECLARE @p2 Float = 28.18
DECLARE @p3 Float = 2

SELECT TOP (1) [t0].[经度], [t0].[纬度]
FROM [##经纬度表] AS [t0]
ORDER BY POWER([t0].[经度] - @p0, @p1) + POWER([t0].[纬度] - @p2, @p3)

收获园豆:10
dotNetDR_ | 老鸟四级 |园豆:2078 | 2011-09-07 15:56

如果答案对你有帮助,请给予答案~谢谢!

dotNetDR_ | 园豆:2078 (老鸟四级) | 2011-09-07 15:57

@dotNetDR_:

真厉害啊……

很不错哎……

需要格局 | 园豆:2145 (老鸟四级) | 2011-09-08 10:11
其他回答(1)
-4

173844862 .Net高级技术交流群 有北大专家指导

辛巴 | 园豆:622 (小虾三级) | 2011-09-07 11:05

博问目前是一个好环境.需要各位共同去打造~请多多配合,谢谢.

支持(1) 反对(0) dotNetDR_ | 园豆:2078 (老鸟四级) | 2011-09-07 16:16

这个垃圾群,一直聊私事,建议只聊技术,居然还踢人

支持(1) 反对(1) 其它用户名 | 园豆:200 (初学一级) | 2011-09-23 11:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册