2011-01-28 56 views
3

我正在使用DAL,并无法弄清如何对返回的数据表进行排序。此案引发错误和智能是不是我提供太多的帮助:ASP.net c#排序数据表

// Get all the specifications available to this user 
Artwork.tblSpecificationsDataTable dsCommon = new Artwork.tblSpecificationsDataTable();    
using (tblSpecificationsTableAdapter specAdapter = new tblSpecificationsTableAdapter()) 
{ 
    specAdapter.FillByClientID(dsCommon, Master.loginData.loggedInUser.company.ID); 
    } 

DataView v = dsCommon.DefaultView; 
v.Sort = "category DESC"; 
dsCommon = (Artwork.tblSpecificationsDataTable)v.ToTable(); 

for (int i = 0; i < dsCommon.Count; i++) 
    { 
    test.Text += dsCommon[i].category + " " + dsCommon[i].FlatSize + "<br />"; 
    } 

错误,而不投是:

错误3无法隐式转换类型 “System.Data.DataTable”来 'Artwork.tblSpecificationsDataTable'。 的显式转换存在(你 缺少强制转换?)

编辑

显然我应该在这是很好的查询中的排序,但我想为了通过任何的选择无需在表格适配器中创建十几个查询,我该如何去做这件事?

+0

你为什么不在数据库中排序? – 2011-01-28 13:42:36

+0

我有一个表格适配器,用于读取行,我想以不同的方式返回行,还有许多排序方法,但不必为每一行都分别进行查询。这是错误的方式去做? – 2011-01-28 13:43:36

回答

2

它不一定是正确的说,数据库会比客户端更快地执行排序 - 在大多数这种情况下,这种说法是正确的,但你必须看SQL Server中的查询计划,看看它真的会更快。

你可以写这样的查询,这使得动态排序表中的适配器...

SELECT 
    <field list> 
FROM 
    <TableName> 
WHERE 
    <Clause> 
ORDER BY 
CASE @OrderBy 
    WHEN 'Field1' THEN Field1 
    WHEN 'Field2' THEN Field2 
    WHEN 'Field3' THEN Field3 
END 
2

这是一个猜测。根据MSDN,DataView.ToTable()返回一个新的DataTable。但你传递一个到一个现有的变量dsCommon.

有一个非常相似propertyDataView.Table是获取或设置源DataTableDataView后面。

贵问题消失,如果你改变线路

dsCommon = (Artwork.tblSpecificationsDataTable)v.ToTable(); 

dsCommon = (Artwork.tblSpecificationsDataTable)v.Table();