当前位置:编程学习 > C#/ASP.NET >>

扩展DataView的查找功能,对已排序的数据进行高效查询

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace 算法接口
{
/// <summary>
/// 能对已按指定列排序的行数据进行高效条件查询的扩展类
/// </summary>
public class DataViewExtend : System.Data.DataView
{
/// <summary>
/// 对DataView中的行进行按条件查询
/// </summary>
/// <param name="strExpression">标准查询表达式</param>
/// <param name="strSort">结果的排序方式</param>
/// <returns>查询的结果行的数组</returns>
public virtual DataRow[] Where(string strExpression, string strSort)
{
return null;
}
}
}


说明:实现DataViewExtend的Where(string strExpression, string strSort)函数,能对将DataViewExtend中的行进行条件查询,返回查询后的结果,具体要求如下

一,能对函数参数strExpression进行解释等类似SQL语句where子句的查询表达式并按查询表达式进行查找,若不了解标准SQL语法,请自行参考SQL的相关资料
能正确解释strExpression字符串参数中的>,<,<>,=,>=,<=,And,Or,NULL,小括号,And的优先级应比Or的优先级高,如果存在小括号,应先处理小括号内的表达式
参数中不存在聚合函数,所以不需要考虑处理聚合函数.
也不需要考虑是否存在关键字.
例如找出20岁以下或60岁以上的男性的查询表达式是:  
"Sex = '男' And (Age > 60 Or Age < 20)"
注意:对于标准的SQL语法,比较字符是否为空引用使用的表达式为"字段名 Is NULL" 或 "字段名 Is Not NULL",
在strExpression参数中,将使用"字段名 = NULL" 或 "字段名 <> NULL" 的形式表示

二,能根据函数参数strSort中的排序关键字对查询结果进行排序
strSort字符串参数的格式为: "字段名1,字段名2,字段名3",字段名与字段名之间使用逗号分隔,不存在空格符,
即:先按字段名1排序,再按字段名2进行排序,最后按字段名3进行排序

三,异常处理
当传入的字符串参数strExpression格式不正确时,应能抛出异常,并提示错误的原因. 
1,比较运算符>,<,<>,=,>=,<=,And,Or 丢失,如:"姓名 '张三'";
2,没有指定字段名,如:"Age > 60 Or < 20";
3,小括号不匹配,即只有左括号没有对应的右括号"(Age > 60 Or Age < 20",或只有右括号没有对应的左括号"Age > 60 Or Age < 20)";
4,不同的数据类型没有使用适当的包括符.
如DateTime类型应在日期的值两边加上#号,如"Date = #2011-1-1#";
string字符串类型应在日期的值两边加上单引号,如:"Name = '张三'";
Boolean类型的值不需要加包括符,如:"IsActive = True" 或 "IsActive <> False";
数值类型的值不需要包括符,如:"Number = 50.0" 或 "Number > 100";
5,存在非法字符,即非字符串值的内容但又不属于关键字的未定义的字符

四,效率
1,效率测试条件:
1.1,将DataViewExtend.Where函数与DataTable.Select函数进行比较
1.2,将DataViewExtend与将DataViewExtend.Table属性的表使用相同的100万行已乱序的数据
1.3,将DataViewExtend.Sort属性指定了排序关键字,DataTable.PrimaryKey也相应指定对应的列作为主键
1.4,将DataViewExtend.Where函数strSort指定了排序条件,DataViewExtend.Table属性的表的Select也相应指定对应的排序条件

2,效率要求 
2.1,将DataViewExtend.Sort属性指定了多个字段作为排序关键字时,并且strExpression参数汲及的各字段都存在于DataViewExtend.Sort属性指定的排序关键字中,
2.2,调用DataViewExtend.Where函数的查询时间应小于或等于DataViewExtend.Table属性的表的Select函数的查询时间的一百份之一
在以下情况下DataViewExtend.Where函数的查询效率不能低于DataViewExtend.Table属性的表的Select函数;
2.2.1,DataViewExtend.Sort属性为null或空字符串,即未按指定关键字排序,
2.2.2,DataViewExtend.Where函数strExpression参数中涉及的字段不存在于DataViewExtend.Sort属性指定的排序关键字中
2.2.3,DataViewExtend.Where函数strExpression参数中使用了Or或运算

--------------------编程问答-------------------- 貌似不难,但是这预算范围也太大了吧。 --------------------编程问答-------------------- 我发现你要求的功能Developer Express控件基本上都能实现 --------------------编程问答-------------------- 这值这么多钱呢啊? --------------------编程问答-------------------- 是的啊。。就这么值钱。。只要你能做出来。 --------------------编程问答-------------------- 这设计非常复杂。。包括重新设计散列算法,设计索引 等等。。
说实话,是个大工程,根本不是一个人能做的了的。需要非常详细的数据存储方案。就象 DataTable 一样
楼主这点钱想做。。。找微软去做吧 为什么没有人重新设计 DataTable ?呵呵
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,