我想使用条件数组的过滤器填充 .NET 数据集。数据集太大,加载后无法加载和过滤。在 C# 中,填充看起来像:
List<int> customerIDs;
...
myAdapter.FillByCustomerIDs(customerIDs);
这将生成 SQL 子句
WHERE CustomerID IN (x,x,x)
其中 x,x,x 来自 customerIDs 数组。
我找不到将这种类型的过滤器传递给 TableAdapter 查询配置向导的任何方法。
在 SQL 中创建一个函数(请注意,@s
参数的长度为 1024,您可能希望增加):
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(1024))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT
CAST(SUBSTRING(@s, start,
CASE
WHEN stop > 0 THEN stop-start
ELSE 512
END) as int) AS s
FROM Pieces
)
GO
和一个存储过程:
CREATE PROCEDURE [dbo].[GetCustomerIds]
@ids nvarchar(max),
@sep char(1)
AS
SELECT *
FROM Customers
WHERE CustomerId in
(SELECT s FROM dbo.Split(@sep,@ids))
RETURN 0
在TableAdapter 查询配置向导中,将命令绑定FillByCustomerIds
到上述存储过程。现在,您可能有以下用法:
List<int> customerIDs = new List<int>() { 1, 2, 3, 4 };
myAdapter
.FillByCustomerIds(dt,
customerIDs.Aggregate<int, string>("",
(s, i) => s + i.ToString() + ","), ",");