Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq或亚音速计算距离_C#_Asp.net_Linq_Google Maps_Subsonic3 - Fatal编程技术网

C# 使用linq或亚音速计算距离

C# 使用linq或亚音速计算距离,c#,asp.net,linq,google-maps,subsonic3,C#,Asp.net,Linq,Google Maps,Subsonic3,我有一个搜索页面上的MySQL语句,用户输入那里的邮政编码,它会在输入的邮政编码15英里内找到最近的stiocklist SELECT * , ( ( ACOS( SIN( "+SENTLNG +" * PI( ) /180 ) * SIN( s_lat * PI( ) /180 ) + COS( " + SENTLNG +" * PI( ) /180 ) * COS( s_lat * PI( ) /180 ) * COS( ( " + SENTLANG + " - s_lng ) * P

我有一个搜索页面上的MySQL语句,用户输入那里的邮政编码,它会在输入的邮政编码15英里内找到最近的stiocklist

 SELECT *  , (
(
ACOS( SIN( "+SENTLNG +" * PI( ) /180 ) * SIN( s_lat * PI( ) /180 ) + COS( " + SENTLNG +" * PI( ) /180 ) * COS( s_lat * PI( ) /180 ) *  COS( (
" + SENTLANG + " - s_lng
) * PI( ) /180 ) ) *180 / PI( )
) *60 * 1.1515
) AS distance_miles
FROM new_stockists
WHERE s_lat IS NOT NULL
HAVING distance_miles <15
ORDER BY distance_miles ASC
LIMIT 0 , 15  
选择*(
(
ACOS(SIN(“+SENTLNG+”*PI()/180)*SIN(s_lat*PI()/180)+COS(“+SENTLNG+”*PI()/180)*COS(s_lat*PI()/180)*COS((
“+SENTLANG+”-s_lng
)*PI()/180))*180/PI()
) *60 * 1.1515
)如距离
来自新的零售商
其中s_lat不为空

使用SQL的以下部分在SQL Server中创建一个新视图:

SELECT * , (your equation here) as distance
FROM new_stocklists
WHERE s_lat is not NULL
然后,您可以为视图创建一个Linq对象(SQLMetal将这样做,或者在VisualStudio中创建LINQtoSQL)。然后可以使用Linq查询此视图。假设您的对象是StockDistance:

var list = db.StockDistance.Where(x=>x.distance<15)
    .OrderBy(x=>x.distance)
    .Take(15);
var list=db.StockDistance.Where(x=>x.distancex.distance)
.采取(15);

您可以在MS SQL中创建一个存储过程,执行您的查询,然后从应用程序调用该查询。Linq确实支持存储过程——有点像这样

partial class StockistsDataContext
{
    [Function(Name = "dbo.NewStockistsByDistance")]
    public ISingleResult<NewStockist> NewStockistsByDistance(
        [Parameter(DbType = "Int", Name = "s_lat")] int lat,
        [Parameter(DbType = "Int", Name = "s_lng")] int lng)
    {
        var result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), lat, lng);
        return ((ISingleResult<NewStockist>)(result.ReturnValue));
    }
}
部分类StockIstDataContext
{
[函数(Name=“dbo.NewStockistsByDistance”)]
公共ISingResult NewStockistsByDistance(
[参数(DbType=“Int”,Name=“s_lat”)]Int lat,
[参数(DbType=“Int”,Name=“s_lng”)]Int lng)
{
var result=this.ExecuteMethodCall(this,((MethodInfo)(MethodInfo.GetCurrentMethod())、lat、lng);
返回((IsingResult)(result.ReturnValue));
}
}
退回到存储过程有点令人恼火,但我认为Linq中解析Queryables expressiontrees的部分无法检测revant数学函数并将其映射到SQL。

我建议(如果可能的话)获取邮政编码的中心点,然后应用哈弗森公式查找特定半径内的所有商店

这里的公式是以公里为单位的。
您必须更改相关数字,它将适用于英里。
例如:将6371.392896换算为英里。

将@radiusInKm声明为FLOAT
将@lat2Compare声明为FLOAT
将@long2Compare声明为FLOAT
设置@radiusInKm=5.000
设置@lat2Compare=在此处插入要比较的\u lat\u 设置@long2Compare=在此处插入要比较的内容

使用(NOLOCK)从插入表格中选择* 其中(6371.392896*2*ATN2(SQRT((sin((弧度)(地纬度-@lat2Compare))/2)*sin((弧度(地纬度-@lat2Compare))/2))+(cos(弧度(地纬度))*cos(弧度(@lat2Compare))*sin(弧度(地经度-@long2Compare)/2)*sin(弧度(地经度-@long2Compare)/2))) ,SQRT(1-((sin((弧度(地纬度-@lat2Compare))/2)*sin((弧度(地纬度-@lat2Compare))/2))+(cos(弧度(地纬度))*cos(弧度(@lat2Compare))*sin(弧度(地经度-@long2Compare)/2)*sin(弧度(地经度-@long2Compare)/2)))
)))试过了,但是如果你看到等式必须以lng和lat作为起点,或者你要从哪里得到你的距离点,已经想到了一个视图,没有实际发送初始起点就无法计算,上面所做的是重新创建我的表,但是在视图中,使用额外的距离字段,但仅从一个设定点,但是感谢inputhmmm有效点,subsonic仍然从未实际创建mysql存储过程的代码从未真正创建过,但这是一个选项,将使我能够传递lng和lat的值。。。。好的,谢谢,我想我会记下这个作为答案。