正如在前面所提到的,绑定大数据量的情况下,通过store procedure的方式来查询数据,这种方式由于比较慢,还有一点就是数据量过大,一下子绑定到datagrid中就会导致页面卡死的情况。无奈~~  ria service 中可以通过webconfig来设置超时时间

<basicHttpBinding>
        <binding name="MyBasicHttpBinding" closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </basicHttpBinding>

 

切入正题

  首先是要写个存储过程来确定数据量,以此来绑上datapager。写好存储过程后,用ef导入存储过程,返回标量image,导入了存储过程以后,在Domainservice中写一个方法

        #region 自定义标量存储过程返回
        private T ExecuteFunction<T>(string functionName, System.Data.EntityClient.EntityParameter[] parameters) where T : struct
        {
            System.Data.EntityClient.EntityCommand cmd = ((System.Data.EntityClient.EntityConnection)this.ObjectContext.Connection).CreateCommand();
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parameters);
            cmd.CommandText = this.ObjectContext.DefaultContainerName + "." + functionName;
            try
            {
                if (cmd.Connection.State != System.Data.ConnectionState.Open)
                    cmd.Connection.Open();
                var obj = cmd.ExecuteScalar();
                return (T)obj;
            }
            catch (System.Exception)
            {
                throw;
            }
            finally
            {
                cmd.Connection.Close();
            }
        }
        #endregion
这样后,我们就能调用返回int的存储过程了,调用方式如下
public int GetPMTotalPages(int PageSize ,string starttime, string endtime,int pm_type,int group_type)
        {                      
            System.Data.EntityClient.EntityParameter[] op = {
                                                           new EntityParameter("startDate",DbType.String),
                                                           new EntityParameter("endDate",DbType.String),                                                          
                                                           new EntityParameter("pm_type",DbType.Int32),
                                                           new EntityParameter("group_type",DbType.Int32)
                                                           };
            op[0].Value = starttime;
            op[1].Value = endtime;
            op[2].Value = pm_type;
            op[3].Value = group_type;
            return ExecuteFunction<int>("proc_GetPM_Count", op) /( PageSize +1 ) +1;
        }

 
客户端的调用方法:

ds_t.GetPMTotalPages(Pagesize, starttime,endtime, PM_Type, cbb_method.SelectedIndex, s =>
            {
                if (!s.HasError)
                {
                    int totalpagers = s.Value;
                    for (int i = 1; i <= totalpagers; i++)
                        itemCount.Add(i);
                    PagedCollectionView pcv = new PagedCollectionView(itemCount);
                    pcv.PageSize = 1;  =======================>这里会引发pageindexchanged事件!
                    this.pagerGrid.Source = pcv;
                }
            }, null);

 

所以,只要在pageindexchanged事件中绑定数据即可

BackgroundWorker worker = new BackgroundWorker();
           
            worker.DoWork += (s, ea) =>
                {
                    Dispatcher.BeginInvoke(new Action(() =>
                        {
                            my_busy.IsBusy = true;
                            if (PM_Type == 0)
                            {
                                ds_t.Load(ds_t.Proc_T_AC_PM_ByPageQuery("2011-07-01", "2011-10-10", cbb_method.SelectedIndex, PageSize, ((DataPager)sender).PageIndex + 1),
                              (lo) =>
                              {
                                  if (lo.Error != null)
                                  {
                                      MessageBox.Show(lo.Error.ToString());
                                      return;
                                  }
                                 
                                  var query = from i in lo.Entities
                                              select new
                                              {
                                                  i.CPU利用率,
                                                  i.内存利用率,
                                                  i.上行速率,
                                                  i.下行速率
                                              };
                                  PagedCollectionView pcv = new PagedCollectionView(lo.Entities);
                                  this.PMGrid.ItemsSource = pcv;
                              }, false);
                            }
worker.RunWorkerCompleted += (o, ea) =>
            {                
                my_busy.IsBusy = false;
            };
            worker.RunWorkerAsync(); 
终于大功告成了,哈哈哈哈!
posted on 2011-10-27 00:17  victor321  阅读(454)  评论(0编辑  收藏  举报