【发布时间】:2013-05-03 10:01:05
【问题描述】:
我们希望在 ASP.NET 2012 中使用 LINQ 从数据库中接收附近地点的列表,并希望对我们的策略提供一些反馈。
我的表格和假数据:
PlaceId Name Latitude Longitude
1 A 18.1 20.1
2 B 18.2 20.2
3 C 18.3 20.3
1) 在我们的项目中,客户端当前位置(经纬度)作为输入
2) 在服务器端,根据客户端当前位置,我们需要使用 LINQ 从数据库中查找附近的地方
这是我之前使用的 SQL 代码,但现在我们要使用 LINQ。
SELECT name, Latitude, Longitude ,
( 3959 * acos( cos( radians(?) )* cos( radians( Latitude) ) * cos( radians( Longitude ) - radians(?) )
+ sin( radians(?) ) * sin( radians( Latitude) ) ) ) AS distance
FROM TABLE_NAME
HAVING distance < ?
ORDER BY distance LIMIT 0 , 20
[但问题是如何在 LINQ 中编写这样的查询。]
我在这方面的工作:
在寻找解决方案时,我遇到了这段代码
var Value1 = 57.2957795130823D;
var Value2 = 3958.75586574D;
var searchWithin = 20;
double latitude = ConversionHelper.SafeConvertToDoubleCultureInd(Latitude, 0),
longitude = ConversionHelper.SafeConvertToDoubleCultureInd(Longitude, 0);
var location = (from l in sdbml.Places
let temp = Math.Sin(Convert.ToDouble(l.Latitude) / Value1) * Math.Sin(Convert.ToDouble(latitude) / Value1) +
Math.Cos(Convert.ToDouble(l.Latitude) / Value1) *
Math.Cos(Convert.ToDouble(latitude) / Value1) *
Math.Cos((Convert.ToDouble(longitude) / Value1) - (Convert.ToDouble(l.Longitude) / Value1))
let calMiles = (Value2 * Math.Acos(temp > 1 ? 1 : (temp < -1 ? -1 : temp)))
where (l.Latitude > 0 && l.Longitude > 0)
orderby calMiles
select new location
{
Name = l.name
});
return location .ToList();
但问题是,如何引用 ConversionHelper 或它来自哪个命名空间。
感谢所有建议。
【问题讨论】:
-
为什么不使用存储过程呢?您可以将存储过程的结果映射到对象,其方式与映射表的方式非常相似,例如getClosePlaces_Result.
-
对不起,我应该提一下,如果你想要的话,你可以指定返回类型是位置列表。
-
@JuannStrauss 除了明显的代码依赖后果外,OP 正在请求如何在 C# 中执行此操作 ;-)
-
这就是我添加评论而不是回答的原因。
标签: asp.net .net linq c#-4.0 sql-to-linq-conversion