2013-08-01 79 views
0

我想使用條件數組的過濾器來填充.NET數據集。數據集太大而無法在加載後加載和過濾。在C#中,填充看起來是這樣的:如何使用數組篩選器填充.NET數據集?

List<int> customerIDs; 
... 
myAdapter.FillByCustomerIDs(customerIDs); 

這樣會生成SQL子句

WHERE CustomerID IN (x,x,x) 

其中X,X,X來自customerIDs陣列。

我找不到任何方式將此類型的篩選器傳遞給TableAdapter查詢配置嚮導。

+0

您可以將參數傳遞給底層Command對象(以及底層查詢或存儲過程)嗎? –

+0

TableAdapter查詢配置嚮導是一個玩具。 –

回答

1

在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() + ","), ",");