dataview查询详解与语法
dataview 的一个主要功能是允许在 windows 窗体和 web 窗体上进行数据绑定。
另外,可自定义 dataview 来表示 datatable 中数据的子集。 此功能让您拥有绑定到同一 datatable、但显示不同数据版本的两个控件。 例如,一个控件可能绑定到显示表中所有行的 dataview,而另一个控件可能配置为只显示已从 datatable 删除的行。 datatable 也具有 defaultview 属性。 它返回表的默认 dataview。 例如,如果希望在表上创建自定义视图,请在 defaultview 返回的 dataview 上设置 rowfilter。
若要创建数据的筛选和排序视图,请设置 rowfilter 和 sort 属性。 然后,使用 item 属性返回单个 datarowview。
还可使用 addnew 和 delete 方法从行的集合中进行添加和删除。 在使用这些方法时,可设置 rowstatefilter 属性以便指定只有已被删除的行或新行才可由 dataview 显示。
用户定义的值可以用在将与列值进行比较的表达式内。字符串值应放在单引号内。日期值应放在磅符号 (#) 内。对于数值,允许使用小数和科学记数法。例如:
"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)
sum(price)
说明:
如果使用一个表来创建聚合,将没有组合功能。相反,所有行都在列中显示相同的值。
如果表没有行,聚合函数将返回 nullnothingnullptrnull 引用(在 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 — 如果表达式为 nullnothingnullptrnull 引用(在 visual basic 中为 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)"
面的示例根据 linq to dataset 查询创建按应付款总额排序的在线订单的 dataview:
datatable orders = dataset.tables["salesorderheader"];
enumerablerowcollection<datarow> query =
from order in orders.asenumerable()
where order.field<bool>("onlineorderflag") == true
orderby order.field<decimal>("totaldue")
select order;dataview view = query.asdataview();
bindingsource1.datasource = view;
下面的示例创建一个具有一个列和五个行的 datatable。 创建两个 dataview 对象,并针对每个对象设置 rowstatefilter 以显示表数据的不同视图。 然后打印这些值。
private void demonstratedataview()
{
// create one datatable with one column.
datatable table = new datatable("table");
datacolumn colitem = new datacolumn("item",
type.gettype("system.string"));
table.columns.add(colitem);// add five items.
datarow newrow;
for(int i = 0; i <5; i++)
{
newrow = table.newrow();
newrow["item"] = "item " + i;
table.rows.add(newrow);
}
// change the values in the table.
table.rows[0]["item"]="cat";
table.rows[1]["item"] = "dog";
table.acceptchanges();// create two dataview objects with the same table.
dataview firstview = new dataview(table);
dataview secondview = new dataview(table);// print current table values.
printtableorview(table,"current values in table");// set first dataview to show only modified
// versions of original rows.
firstview.rowstatefilter=dataviewrowstate.modifiedoriginal;// print values.
printtableorview(firstview,"first dataview: modifiedoriginal");// add one new row to the second view.
datarowview rowview;
rowview=secondview.addnew();
rowview["item"] = "fish";// set second dataview to show modified versions of
// current rows, or new rows.
secondview.rowstatefilter=dataviewrowstate.modifiedcurrent
| dataviewrowstate.added;
// print modified and added rows.
printtableorview(secondview,
"second dataview: modifiedcurrent | added");
}private void printtableorview(datatable table, string label)
{
// this function prints values in the table or dataview.
console.writeline("n" + label);
for(int i = 0; i<table.rows.count;i++)
{
console.writeline("table" + table.rows[i]["item"]);
}
console.writeline();
}private void printtableorview(dataview view, string label)
{// this overload prints values in the table or dataview.
console.writeline("n" + label);
for(int i = 0; i<view.count;i++)
{
console.writeline("table" + view[i]["item"]);
}
console.writeline();
}