2011-12-21 51 views
0

我有一个页面加载有点慢,因此我想加载页面完成加载后的GridView中的数据。Databind Grid LINQ异步ASP.NET C#

我想,继续使用我的LinqDataSource1_Selecting - 因为当我绑定的GridView与Grid1.DataSource我得到这个错误:

不能为未实现ICollection的数据源计算计数。

现在我已经尝试过使用BackgroundWorker,Asynchronous Pages和一个计时器。但我无法真正让他们像我想要的那样工作。

这是我如何结合我的数据:

protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
     GWportalDataContext db = new GWportalDataContext(); 
     DeliveryTimeRepository dltRep = new DeliveryTimeRepository(); 

     var query = from o in db.Orders 
        join y in db.OrderLines on o.OrderID equals y.OrderID 
        join x in db.Products on y.ItemNumber equals x.ItemNumber 
        where o.AccountNumber == AppSession.CurrentLoginTicket.AccountNumber 
        select new 
        { 
         o.OrderID, 
         o.AxaptaSalesId, 
         y.ItemNumber, 
         Name = x.Name + o.OrderID, 
         x.ProductFormatName, 
         y.Quantity, 
         y.Price, 
         Status = dltRep.getOrderStatus(o.OrderID, o.AxaptaSalesId, y.ItemNumber).Substring(0, dltRep.getOrderStatus(o.OrderID, o.AxaptaSalesId, y.ItemNumber).LastIndexOf("|")), 
         Levering = dltRep.getOrderStatus(o.OrderID, o.AxaptaSalesId, y.ItemNumber).Substring(dltRep.getOrderStatus(o.OrderID, o.AxaptaSalesId, y.ItemNumber).LastIndexOf("|")).Replace("|", "") 
        }; 

     var query2 = from o in db.AxSales 
        join y in db.AxSaleLines on o.SalesId equals y.SalesId 
        join x in db.Products on y.ItemNumber equals x.ItemNumber 
        where o.AccountNumber == AppSession.CurrentLoginTicket.AccountNumber 
        select new 
        { 
         OrderID = o.SalesId, 
         AxaptaSalesId = o.SalesId, 
         y.ItemNumber, 
         Name = x.Name + o.SalesId, 
         x.ProductFormatName, 
         y.Quantity, 
         Price = y.SalesPrice, 
         Status = dltRep.getAxOrderStatus(o.SalesId, y.ItemNumber).Substring(0, dltRep.getAxOrderStatus(o.SalesId, y.ItemNumber).LastIndexOf("|")), 
         Levering = dltRep.getAxOrderStatus(o.SalesId, y.ItemNumber).Substring(dltRep.getAxOrderStatus(o.SalesId, y.ItemNumber).LastIndexOf("|")).Replace("|", "") 
        }; 

     //Query 1 start 
     var dataToList = query.ToList(); 
     List<object> deletedItems = dataToList.Where(item => orderDeleted(item.OrderID, item.AxaptaSalesId)).Cast<object>().ToList(); 
     var datatoGrid = dataToList.Except(deletedItems); 
     // Query 1 end 

     //Query 2 start 
     var dataToList2 = query2.ToList(); 
     List<object> deletedItems2 = dataToList2.Where(item => axOrderDeleted(item.AxaptaSalesId)).Cast<object>().ToList(); 
     var dataToGrid2 = dataToList2.Except(deletedItems2); 
     //Query 2 end 

     var combined = datatoGrid.Union(dataToGrid2); 
     e.Result = combined; 
} 

回答

0

你确保投你e.Result回一个List<Object>,当你把它绑定到数据网格?

DataGrid.DataSource = (List<Object>)e.Result; 

e.ResultObject不执行ICollection

基于OP评论

既然你是调用此为

datatoGrid.Union(dataToGrid2); 

你只需做一个

dataGrid.Union(dataToGrid2).ToList(); 
+0

使用转换时,出现以下错误消息: 无法转换类型为' d__88'1 [System.Object]'的对象以键入'System.Collections.Generic.List'1 [System.Object] ”。 – KLIM8D 2011-12-21 17:00:22

+0

C#:var combined = datatoGrid.Union(dataToGrid2); Grid1.DataSource =(列表)合并; Grid1.DataBind(); – KLIM8D 2011-12-21 17:01:18

+0

@ KLIM8D查看我的编辑 – msarchet 2011-12-21 17:02:55