asp.net

DataTable的Select方法

2011-02-19

问:

DataRow[]   drArray;

string   strExpr;
string   strSort;


strExpr   =   "Subject   like   % "+tbCondition.Text+ "% ";//这里应该如何写?查了不少贴子都没有类似这样的写法。主要是like

                  strSort   =   "ID   DESC ";
drArray   =   dt.Select(strExpr,strSort,DataViewRowState.CurrentRows);//dt是DataTable的实例,这行执行之后,dt原来的数据是否已经改变。

 

回答:

Expression   属性的一个用途是创建计算出的列。例如,若要计算税值,就要将单价乘以给定地区的税率。由于各地税率不同,不可能将单一的税率放在列中;于是便用   Expression   属性来计算这个值,如下面的   Visual   Basic   代码所示:

DataSet1.Tables( "Products ").Columns( "tax ").Expression   =   "UnitPrice   *   0.086 "

第二个用途是创建聚合列。类似于计算出的值,聚合基于   DataTable   中的整个行集执行操作。一个简单的示例是对返回到集中的行数进行计数,这也就是您可能用来对某个特定销售人员完成的交易次数进行计数的方法,如下面的   Visual   Basic   代码所示:

DataSet1.Tables( "Orders ").Columns( "OrderCount ").Expression   =   "Count(OrderID) "

表达式语法

在创建表达式时,使用   ColumnName   属性来引用列。例如,如果一个列的   ColumnName   是“UnitPrice”(单价),而另一个是“Quantity”(数量),则表达式将是:

"UnitPrice   *   Quantity "

在为筛选器创建表达式时,将字符串放到单引号中:

"LastName   =   Jones "

下面的字符是特殊字符,如下面所解释的,如果它们用于列名称中,就必须进行转义:

\n   (newline)

\t   (tab)

\r   (carriage   return)

~

(

)

#

\

/

=

>

<

+

-

*

%

&

|

^

"

[

]

如果列名称包含上面的字符之一,该名称必须用中括号括起来。例如,若要在表达式中使用名为“Column#”的列,应写成“[Column#]”:

Total   *   [Column#]

由于中括号是特殊字符,如果它是列名称的组成部分,必须使用斜杠   ( "\ ")   将中括号转义。例如,名为“Column[]”的列应写成:

Total   *   [Column[\]]

(只有第二个中括号必须转义。)

用户定义的值

用户定义的值可以用在将与列值进行比较的表达式内。字符串值应放在单引号内。日期值应放在磅符号   (#)   内。对于数值,允许使用小数和科学记数法。例如:

"FirstName   =   John "

"Price   <=   50.00 "

"Birthdate   <   #1/31/82# "

对于包含枚举值的列,将值强制转换为整数数据类型。例如:

"EnumColumn   =   5 "

运算符

使用布尔值   AND、OR   和   NOT   运算符时允许串联。可以使用括号来组合子句和强制优先级。AND   运算符优先于其他运算符。例如:

(LastName   =   Smith    OR   LastName   =   Jones )   AND   FirstName   =   John

在创建比较表达式时,允许使用下列运算符:

<

>

<=

> =

<>

=

IN

LIKE

在表达式中还支持下列算术运算符:

+(加)

-(减)

*(乘)

/(除)

%(模数)

字符串运算符

若要连接字符串,请使用   +   字符。字符串比较是否区分大小写由   DataSet   类的   CaseSensitive   属性的值来确定。但是,可以用   DataTable   类的   CaseSensitive   属性重写此值。

通配符

在   LIKE   比较中,*   和   %   两者可以互换地作为通配符。如果   LIKE   子句中的字符串包含   *   或   %,那么这些字符应用中括号([])对其进行转义。如果子句中有中括号,那么中括号字符应用中括号对其进行转义(例如   [[]   或   []])。在模式的开头和结尾,或者在模式的结尾,或在模式的开头允许使用通配符。例如:

"ItemName   LIKE   *product* "

"ItemName   LIKE   *product "

"ItemName   LIKE   product* "

在字符串的中间不允许使用通配符。例如,不允许   te*xt 。

父/子关系引用

通过在列名称前面加   Parent,就可以在表达式中引用父表。例如,Parent.Price   引用父表的名为   Price   的列。

通过在列名称前面加一个   Child,就可以在表达式中引用子表中的列。但是,因为子关系可以返回多行,所以必须在聚合函数中包括对子列的引用。例如,Sum(Child.Price)   将返回子表中名为   Price   的列的总和。

如果某个表有多个子表,则语法是:Child(RelationName)。例如,如果某个表有两个子表,它们的名称分别为   Customers   和   Orders,则   DataRelation   对象被命名为   Customers2Orders,引用将为:

Avg(Child(Customers2Orders).Quantity)

聚合

支持下列聚合类型:

Sum(求和)

Avg(平均)

Min(最小值)

Max(最大值)

Count(计数)

StDev(统计标准偏差)

Var(统计方差)。

聚合通常沿着关系执行。通过使用上面列出的函数之一和上面“父/子关系引用”中详述的子表列,来创建聚合表达式。例如:

Avg(Child.Price)

Avg(Child(Orders2Details).Price)

聚合也可以在单个表上执行。例如,若要为名为“Price”的列中的数字创建汇总,就用:

Sum(Price)

注意       如果使用一个表来创建聚合,将没有组合功能。相反,所有行都在列中显示相同的值。
如果表没有行,聚合函数将返回空引用(Visual   Basic   中为   Nothing)。

数据类型总是可以通过检查列的   DataType   属性来确定。还可以使用   Convert   函数来转换数据类型,如下所示。

FUNCTIONS 

还支持下列函数:

CONVERT 

描述   将给定表达式转换为指定的   .NET   Framework   类型。 
语法   Convert(expression,   type) 
参数   expression   —   要转换的表达式。 
type   —   值将转换成的   .NET   Framework   类型。
 

例如:myDataColumn.Expression= "Convert(total,   System.Int32 ) "

所有转换都是有效的,只有下列情况例外:Boolean   只能与   Byte、SByte、Int16、Int32、Int64、UInt16、UInt32、UInt64、String   和它本身相互转换。Char   只能与   Int32、UInt32、String   和它本身相互转换。DateTime   只能与   String   和它本身相互转换。TimeSpan   只能与   String   和它本身相互转换。

LEN 

描述   获取字符串的长度 
语法   LEN(expression) 
参数   expression   —   要计算的字符串。 

例如:myDataColumn.Expression= "Len(ItemName) "

ISNULL 

描述   检查表达式并返回已检查的表达式或返回替换值。 
语法   ISNULL(expression,   replacementvalue) 
参数   expression   —   要检查的表达式。 
replacementvalue   —   如果表达式为空引用   (Nothing),则返回   replacementvalue。
 

例如:myDataColumn.Expression= "IsNull(price,   -1) "

IIF 

描述   根据逻辑表达式的结果,获取两个值之一。 
语法   IIF(expr,   truepart,   falsepart) 
参数   expr   —   要计算的表达式。 
truepart   —   表达式为真时返回的值。

falsepart   —   表达式为假时返回的值。
 

例如:myDataColumn.Expression   =   "IIF(total> 1000,   expensive ,   dear )

TRIM 

描述   移除所有前导的和后缀的空格字符,如\r、\n、\t、     
语法   TRIM(expression) 
参数   expression   —   要剪裁的表达式。 

SUBSTRING 

描述   获取从字符串中的指定点开始,具有指定长度的子字符串。 
语法   SUBSTRING(expression,   start, 
length)
 
参数   expression   —   子字符串的源字符串。 
start   —   指定子字符串开始位置的整数。

length   —   指定子字符串长度的整数。
 

例如:myDataColumn.Expression   =   "SUBSTRING(phone,   7,   8) "

注意       可以向   Expression   属性分配一个空值或空字符串,来重置该属性。如果为表达式列设置了一个默认值,则在重置   Expression   属性之后,这个默认值就赋给所有以前填充过的行。


补充

通配符

在   LIKE   比较中,*   和   %   两者可以互换地作为通配符。如果   LIKE   子句中的字符串包含   *   或   %,那么这些字符应用中括号([])对其进行转义。如果子句中有中括号,那么中括号字符应用中括号对其进行转义(例如   [[]   或   []])。在模式的开头和结尾,或者在模式的结尾,或在模式的开头允许使用通配符。例如:

"ItemName   LIKE   *product* "

"ItemName   LIKE   *product "

"ItemName   LIKE   product* "

在字符串的中间不允许使用通配符。例如,不允许   te*xt 。