【问题标题】:Passing a List of DBGeometry to retrieve points contained from SQL传递 DBGeometry 列表以检索 SQL 中包含的点
【发布时间】:2018-04-23 19:01:09
【问题描述】:

我的 SQL 服务器上有一个数据集,其中包含几百万个地理点,我想根据我在客户端创建的 DBGeography 矩形网格来检索这些点。基本上,我想传入一个 c# List of DBGeography ,我的服务器将返回适合这些几何图形的点列表,以及它们所属的 DBGeography 。我目前正在查询每个单独的矩形,如果我要拉的地图被分成大量的瓷砖,则会引起很多查询。显然性能会受到影响。

我目前正在使用下面的代码。

var pointsInRectangle = (from p in MyTable.Points
                                       where MyRectangle.Intersects(p.Location)
                                       select p).ToList();

问题:我将如何更改它以传入 DBGeography 矩形列表并获取相应的数据?

MyRectangle 是我在 C# 中创建的 DBGeography,而 Location 是我的 SQL 表中的点地理。此代码当前有效,但一次仅适用于一个单元格。我尝试了几件事,但无济于事。实体框架不是我的专长,但我也不知道如何直接使用 SQL(尽管如果需要解决方案,我可以使用 SQL)。

我还尝试将所有点(从较大的外部矩形)拉到客户端,然后在客户端进行处理以将其细分为网格。即使初始查询几乎是即时的(可能是因为索引),性能也很慢。

【问题讨论】:

  • 您可以创建一个表类型(这是在 SQL 中创建的一种结构,用于以表格式保存数据,您可以将其传递给存储过程。然后在 SQL 中将该表类型变量视为您的逻辑中的一个表格供您选择
  • 也许将所有矩形与联合(DbGeography 方法)结合起来?那么您只需要一个查询。

标签: c# sql-server entity-framework geography dbgeography


【解决方案1】:

你必须做几件事。在 SQL 中创建一个表类型(下面的代码),创建一个存储过程以接受表类型并从该表类型中进行选择(选择下面的示例),然后在您的 C# 代码中填充 SQL 类型并将其传递给调用您创建的存储过程。 (下面是填充表类型变量,而不是 SQLCommand 的其余部分。

// create table type in SQL (this is an example in case you need to pass more then 1 field/value
CREATE TYPE [dbo].[NameValuePairTable] AS TABLE(
    [Name] [NVARCHAR](MAX) NULL,
    [Value] [NVARCHAR](MAX) NULL
)
GO

在此处使用名称值对参数创建 SP

Create PROCEDURE [dbo].[SPPassingTableType]         
    @NameValuePairAnswers as dbo.NameValuePairTable READONLY    
AS
BEGIN
    -- do your SQL logic stuff here

    -- this will select from the table type you passed to the SP
    SELECT * 
    FROM @NameValuePairAnswers  
END

在您的 c# 代码中,您可以执行此操作。 注意:这不是完整的 C# 代码,这只是展示如何处理表类型变量并填充它。您仍然需要生成 SQL 命令并将此表类型传递给 SQL 命令

// now build out the namevalue pair paramater
                SqlParameter TableData = new SqlParameter();
                TableData.ParameterName = "@NameValuePairAnswers";
                TableData.TypeName = "dbo.NameValuePairTable";
                TableData.SqlDbType = SqlDbType.Structured;
                TableData.Value = dtFormResultsToSave; 

其中 dtFormResultsToSave 是与上述 SQL 中的表类型匹配的数据表。

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 2020-11-28
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多