怎样使用WCF返回数据库实体的大数据

海涵德 2012-12-17 08:55:17
返回时我使用的是
[operatorcontact]public list<我的实体> take_我的实体(int index,int count)
{
var q =from s in 我的实体 select s;
return q.Skip(index).Take(count).tolist();
}

这种方法需要每次通过改变 index =index+count方法访问wcf,效率很低,怎样通过一次性的方法返回数量的的表
return q.tolist();肯定不行,能不能通过一次访问WCF,把q多次返回呢?
...全文
421 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bonjour-你好 2012-12-20
  • 打赏
  • 举报
回复
引用 10 楼 madaming 的回复:
数据库实体就是表,我还没有使用过ria,是不是ria已经解决了这个问题。
对的,我也是刚学Silverlight不久,之前连WCF是什么也不知道(现在也是不会自己写WCF。。。),这个ria好像是在wcf上再封装的,创建后直接能用,我也是跟着微软的教程做的。 http://msdn.microsoft.com/zh-cn/library/ee707344%28v=VS.91%29.aspx 如果你返回数据大的时候有报错的话,我推荐用SvcTraceViewer.exe来跟踪一下wcf的信息,因为我最近遇到的问题,就是那个wcf的序列化限制问题,如果没有用跟踪器查看错误信息,程序只会报错“Not Found”。
海涵德 2012-12-20
  • 打赏
  • 举报
回复
不必跟踪,wcf就是不能返回大数据,与内存关系很大。
海涵德 2012-12-19
  • 打赏
  • 举报
回复
数据库实体就是表,我还没有使用过ria,是不是ria已经解决了这个问题。
Bonjour-你好 2012-12-19
  • 打赏
  • 举报
回复
引用 8 楼 madaming 的回复:
序列化限制没有什么用,能否给出具体代码和方法。
话说,数据库实体是指“数据库本身”还是“数据库中的表”?我是新手,我怕我搞错了 我是用WCF RIA Service的,跟WCF应该差不多吧。 服务端:

[EnableClientAccess()]
public class CustomerDomainService : DomainService
{
   数据库 context = new 数据库();

   public IQueryable<数据库中的表> Get_我的表(int id)
   {
        return from temp in context.数据库中的表
               where temp.ID == id
               select temp;
    }
}
客户端:

public partial class MainPage : UserControl
{
    private CustomerDomainContext _customerContext = new CustomerDomainContext();

    public MainPage()
    {
        InitializeComponent();

        LoadOperation<数据库中的表> lo =_customerContext.Load(_customerContext.Get_我的表Query(1));
        lo.Completed += new EventHandler(lo_Completed);
    }

    void lo_Completed(object sender, EventArgs e)
    {
        LoadOperation<数据库中的表> contact = (LoadOperation<数据库中的表>)sender;
        dataGrid1.ItemsSource = contact.Entities;
        //dataGrid1.ItemsSource = contact.Entities.Take(数量);
    }
}
Bonjour-你好 2012-12-18
  • 打赏
  • 举报
回复
因为就是说,楼主想一次返回一个实体,而由于实体中的数据量很大,所以不能返回?那是不是WCF序列化大小限制的问题? 你说的100条,是不是含有好多列的?我自己返回1W行也可以啊
海涵德 2012-12-18
  • 打赏
  • 举报
回复
电影院的例子很恰当。
海涵德 2012-12-18
  • 打赏
  • 举报
回复
我的意思是买一张团体票,然后我那个团体排好队一个一个进入电影院,而不是每个人都买一张票,然后再排队进入。买票很占用时间,对每个人都存在找零的事,这才是效率低的原因。
海涵德 2012-12-18
  • 打赏
  • 举报
回复
return q.tolist();本来就能返回所有记录,只不过wcf不能把太多的数据送到客户端。 再详细说一下: 服务端(web)代码: [operatorcontact]public list<我的实体> take_我的实体0() { var q =from s in 我的实体 select s; return q.tolist(); } [operatorcontact]public list<我的实体> take_我的实体1(int index,int count) { var q =from s in 我的实体 select s; return q.Skip(index).Take(count).tolist(); } 客户端(sl)代码1: count=20; index=index+count wcf.take_我的实体1Async(index,count); 反复使用上面的代码,直至得到所有数据,事件相应代码这里就不写了,这种办法可以一点一点的把数据取出。 客户端(sl)代码2: wcf.take_我的实体0Async(); 这种办法可貌似一次性的得到数据,但是wcf做不到,尤其是记录数量很大时,我试过100条记录就出问题了,如果服务端内存占用大,还达不到100条呢。
海涵德 2012-12-18
  • 打赏
  • 举报
回复
序列化限制没有什么用,能否给出具体代码和方法。
海涵德 2012-12-18
  • 打赏
  • 举报
回复
列多也是返回记录少的原因,不知道1w行是多少行? 能否给出具体代码。
  • 打赏
  • 举报
回复
比如别人说“在电影院门口排一下队,才能尽快入场”,你立刻脱口而出“排队入场效率很低,我偏要大家蜂拥而入”。旁观者心里其实会窃笑地。
  • 打赏
  • 举报
回复
晕死! 你用参数 (0,int.MaxValue) 来一次性调用所有数据不就行了嘛。 这种方法是非常通用的,即使你滥用什么“一次性读取所有数据”,也可以调用这个方法。 这种方法的目的就是大规模数据操作时真正去优化数据查询速度,让界面上得到更好的用户体验。你的所谓“效率很低”实在是让我觉得无厘头。

8,736

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧