【问题标题】:How can I convert this SQL to VB.NET LINQ如何将此 SQL 转换为 VB.NET LINQ
【发布时间】:2015-09-11 09:29:32
【问题描述】:

我在将此语句从 SQL 转换为 LINQ 时遇到了一些问题。

DECLARE @radians float
SELECT @radians = 57.295779513082323 
SELECT 
    t1.*, 
    DistanceInMiles = 
        3963.0*acos(
            sin(t1.Latitude/(@radians))
            * sin(t2.Latitude/(57.295779513082323))
            + cos(t1.Latitude/(@radians))
            * cos(t2.Latitude/(@radians)) 
            * cos(t2.Longitude/(@radians) - t1.Longitude/(@radians))
        )
FROM ZipCodeData t1
JOIN ZipCodeData t2 ON (
    3963.0*acos(
        sin(t1.Latitude/(@radians)) 
        * sin(t2.Latitude/(57.295779513082323)) 
        + cos(t1.Latitude/(@radians)) 
        * cos(t2.Latitude/(@radians)) 
        * cos(t2.Longitude/(@radians) 
        - t1.Longitude/(@radians))
    ) < 100
)
WHERE t2.ZipCode='10001'
ORDER BY DistanceInMiles

我在 VB.NET 中工作

我不知道从哪里开始

Dim results = z1 in Entities.ZipCodeDatas

好的,我有一个开始,但认真

编辑:

Dim radians = 57.29577951309232
Dim results = From z1 In Entities.ZipCodeDatas
              z1.ZipCode
              Join z2 In Entities.ZipCodeDatas On z2.ZipCode Equals z1.ZipCode        

首先,我不知道如何创建DistanceInMiles,我不知道如何创建第二个Join,我不知道如何使用Less than &lt; 子句加入表

编辑 2:

Dim result = (
    From z1 In Entities.ZipCodeDatas
    Join z2 In Entities.ZipCodeDatas On z2.ZipCode Equals z1.ZipCode
    Where (
        3963.0 * Math.Acos(
            Math.Sin(z1.Latitude.Value / (radians)) _
            * Math.Sin(z2.Latitude.Value / (57.295779513082323)) _
            + Math.Cos(z1.Latitude.Value / (radians)) _
            * Math.Cos(z2.Latitude.Value / (radians)) _
            * Math.Cos(z2.Longitude.Value / (radians) - z1.Longitude.Value / (radians)) _
        )
    ) < radius
)

【问题讨论】:

  • 别忘了您可以选择将上述内容转换为存储过程,然后使用 EF 调用该过程。

标签: sql vb.net linq entity-framework


【解决方案1】:

类似这样的:

Dim radians = 57.295779513082323
Dim result = ( _
    From t1 in Entities.ZipCodeDatas
    From t2 in Entities.ZipCodeDatas
    Where t2.ZipCode = "10001" _
    And 3963.0 * SqlFunctions.Acos( _
        SqlFunctions.Sin(t1.Latitude / (radians)) _
        * SqlFunctions.Sin(t2.Latitude/(57.295779513082323)) _
        + SqlFunctions.Cos(t1.Latitude/(radians)) _
        * SqlFunctions.Cos(t2.Latitude/(radians)) _
        * SqlFunctions.Cos(t2.Longitude/(radians) - t1.Longitude/(radians)) _
    ) < 100
    Select New With { _
        ZipCodeDatas = t1, _
        DistanceInMiles = 3963.0 * SqlFunctions.Acos( _
            SqlFunctions.Sin(t1.Latitude/(@radians)) _
            * SqlFunctions.Sin(t2.Latitude/(57.295779513082323)) _
            + SqlFunctions.Cos(t1.Latitude/(@radians)) _
            * SqlFunctions.Cos(t2.Latitude/(@radians)) _
            * SqlFunctions.Cos(t2.Longitude/(@radians) - t1.Longitude/(@radians)) _
        )
    }
).OrderBy(o => o.DistanceInMiles)

【讨论】:

  • 我将不得不对此进行一些编辑——你的 vb 已经生锈了 :)
  • 我将无法像那样加入 -- Equals 是预期的
  • 我想知道你为什么要加入,如果没有 t2 加入,它不会工作吗? &lt; 100 应该添加到 where 子句中。
  • 我正在比较同一张表中的不同值,以便找到符合要求的条目,即我传入的邮政编码并且在原始的给定半径(这里是 100 英里)内邮政编码
  • 我明白了,这是有道理的。我有一个想法,可能会也可能不会……稍后会进行编辑。 :)
猜你喜欢
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2021-04-10
  • 2016-08-07
  • 2016-01-23
  • 2022-01-22
相关资源
最近更新 更多