传递 DBGeometry 列表以检索 SQL 中包含的点
Passing a List of DBGeometry to retrieve points contained from SQL
我的 SQL 服务器上有一个数据集,其中包含几百万个地理点,我想根据我在客户端创建的 DBGeography 矩形网格检索这些地理点。基本上我想传入一个 C# DBGeography 列表,我的服务器将返回适合这些几何图形的点列表,以及它们所属的 DBGeography。我目前正在查询每个单独的矩形,如果我拉的地图被分成大量的图块,则会导致很多查询。显然性能受到影响。
我目前正在使用下面的代码。
var pointsInRectangle = (from p in MyTable.Points
where MyRectangle.Intersects(p.Location)
select p).ToList();
问题:如何修改它以传入 DBGeography 矩形列表并取回相应的数据?
MyRectangle 是我在 C# 中创建的 DBGeography,而 Location 是我 SQL table 中的点地理。此代码目前有效,但一次只能用于一个单元格。我尝试了几件事但无济于事。 Entity Framework 不是我的专长,但我也不知道如何直接使用 SQL(尽管如果需要解决方案,我可以使用 SQL)。
我还尝试将所有点(从较大的外部矩形)拉到客户端,然后在客户端处理以将其细分为网格。即使初始查询几乎是即时的(可能是因为索引),性能也非常慢。
你必须做几件事。在 SQL 中创建一个 table 类型(下面的代码),创建一个存储过程以接受 Table 类型和 select 来自该 table 类型(select 下面的示例),然后在您的 C# 代码中填充 SQL 类型并将其传递给调用您创建的存储过程的 SQLCommand。 (填充 Table 类型变量在下面,而不是 SQL 命令的其余部分。
// 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# 代码,这只是展示如何处理 table 类型变量并填充它。您仍然需要生成 SQL 命令并将此 table 类型传递给 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 是一个数据table,与上面 SQL 中的 Table 类型匹配。
我的 SQL 服务器上有一个数据集,其中包含几百万个地理点,我想根据我在客户端创建的 DBGeography 矩形网格检索这些地理点。基本上我想传入一个 C# DBGeography 列表,我的服务器将返回适合这些几何图形的点列表,以及它们所属的 DBGeography。我目前正在查询每个单独的矩形,如果我拉的地图被分成大量的图块,则会导致很多查询。显然性能受到影响。
我目前正在使用下面的代码。
var pointsInRectangle = (from p in MyTable.Points
where MyRectangle.Intersects(p.Location)
select p).ToList();
问题:如何修改它以传入 DBGeography 矩形列表并取回相应的数据?
MyRectangle 是我在 C# 中创建的 DBGeography,而 Location 是我 SQL table 中的点地理。此代码目前有效,但一次只能用于一个单元格。我尝试了几件事但无济于事。 Entity Framework 不是我的专长,但我也不知道如何直接使用 SQL(尽管如果需要解决方案,我可以使用 SQL)。
我还尝试将所有点(从较大的外部矩形)拉到客户端,然后在客户端处理以将其细分为网格。即使初始查询几乎是即时的(可能是因为索引),性能也非常慢。
你必须做几件事。在 SQL 中创建一个 table 类型(下面的代码),创建一个存储过程以接受 Table 类型和 select 来自该 table 类型(select 下面的示例),然后在您的 C# 代码中填充 SQL 类型并将其传递给调用您创建的存储过程的 SQLCommand。 (填充 Table 类型变量在下面,而不是 SQL 命令的其余部分。
// 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# 代码,这只是展示如何处理 table 类型变量并填充它。您仍然需要生成 SQL 命令并将此 table 类型传递给 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 是一个数据table,与上面 SQL 中的 Table 类型匹配。