2011-01-25 79 views
3

我正在创建Visual Studio中的自定义数据库测试条件,并试图验证排序顺序。验证数据表是否已排序

验证DataTable中的行实际上已排序,但我也想验证每个排序列是否至少有一个具有多个不同值的分组。

我维护定义排序列的整数列表(负整数表示降序排列顺序 - 而整数的绝对值是列号)。

让我澄清。

我正在编写一个单元测试条件,验证排序后的DataTable。我可以验证该行的排序顺序是否正确,但我想验证结果集是否包含实际测试排序的数据。换句话说,只有一行或任意数量的重复行的结果集确实被排序,但实际上并没有测试排序。

我需要验证该排序的每个级别在至少一个分组中包含至少两个不同的值。

在过去,我使用了SQL和.Net代码的组合,并使用以下一组查询来确保有足够的数据来测试排序。

SELECT TOP 1 COUNT(DISTINCT column1) 
FROM table 
HAVING COUNT(DISTINCT column1) > 1 

SELECT TOP 1 column1, COUNT(DISTINCT column2) 
FROM table 
GROUP BY column1 
HAVING COUNT(DISTINCT column2) > 1 

SELECT TOP 1 column1, column2, COUNT(DISTINCT column3) 
FROM table 
GROUP BY column1, column2 
HAVING COUNT(DISTINCT column3) > 1 

我对每个级别都有一个查询,并且所有查询必须返回一个非空结果集才能通过单元测试。

我真正的问题是如何将上面的SQL代码复制/转换为LINQ?

回答

0

我想你确认它与沿

for (int i = 1; i < rowCount; i++) { 
    for (int j = 0; j < sortColCount; j++) { 
     int col = colNum(sortCols[j]); 
     int d = Compare(GetValue(rows[i], col), GetValue(rows[i-1], col)); 
     if (d == 0) continue; 
     // Insert here 
     Assert(d == colDir(sortCols[j])); 
    } 
}
你需要做什么线路双回路来分类的,我已经把注释插入命令标志排序列,d为试(例如,使用一个布尔数组)。然后在循环声明每个排序列被测试后。

+0

谢谢,但你错过了我的观点 - 我添加了更多的解释来帮助澄清。 – 2011-01-26 19:59:54

+0

@罗德尼,我想我明白了,并且我描述了什么(确保你在伪代码之后阅读段落)执行你在澄清中添加的相同测试(并且更高效地引导)。唯一的区别是你已经添加了使用LINQ的细节,并且因为我没有使用LINQ,所以我会退出。 – 2011-01-26 23:04:15

0

您可以通过挂接DataTable的TableNewRow,RowChanging和RowChanged事件来跟踪/强制DataTable是否按照您期望的方式排序,从而节省必要的迭代成本。

否则,它是蛮力:

foreach (int i = 1 ; i < dt.Rows.Length ; ++i) 
{ 
    DataRow prev = dt.Rows[i-1] ; 
    DataRow curr = dt.Rows[i ] ; 

    Assert(CompareRows(prev,curr) <= 0) ; 

} 

CompareRows(prev,curr)返回通常的排序比较结果:-1分组< CURR,0为一个先前== CURR和1为先前> CURR);