商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

LINQ to SQL with WF : IQueryable / IQueryable / List, that’s a question?

作者:mmkk博客  2008-01-16

  但是我没有考虑到IQueryable不能跨assembly, 一旦跨了assembly的话, 你无法使用var来引用这个匿名类里面的property, 绑定到control是没有问题的, 但是客户端的动态查询却成了问题, 因为你根本不知道匿名类是什么.
 
  最后让我们来看最后的选择IQueryable<T>, 我们选择返回IQueryable<T>给客户端, 分页 / 排序都没有任何问题, 且默认情况下我们返回了实体类的所有字段, 至于是否返回了Association类的信息则取决于绑定情况, 而且这里要非常注意, 如果你不小心在前端绑定代码中使用Association类的字段, 例如ClaimRequest.User.LastName这类的信息很有可能会执行n条的SQL语句, 这个要非常注意, 时刻注意生成的SQL语句的情况是个好的习惯. 为了取得更好的性能, 我还是希望能够使用匿名类来过滤我不需要的字段, IQueryable<T>做到这个完全没有问题, 类似这样:
var q = ClaimRequestManager.GetPagedClaimRequests(((MasterPage)this.Master).GetUserID(), STATE_NAME, myPager.PageSize, myPager.PageIndex + 1, out totalRecords); //fields what we need var filter = q.Select(c => new { ClaimRequestID = c.ClaimRequestID, ClaimNumber = c.ClaimNumber, ClaimName = c.ClaimName, DateSubmitted = c.DateSubmitted, SubmittedBy = c.SubmittedBy, SubmittedUserName = c.User.LastName + “, “ + c.User.FirstName } ); rptValidatingReqList.DataSource = filter; rptValidatingReqList.DataBind();
  GetPagedClaimRequests实际上包含了ClaimRequest所有字段的信息, 当然并没有实际执行, 除非你绑定到控件上. 然后客户端可以自己选择到底要使用哪些字段, 尤其IQueryable<T>包含了T所关联的所有信息, 我们可以选择关系类的其他字段进行操作, 过滤后最终进行绑定, 最终我们选择了IQueryable<T>, 强类型 + 灵活的动态查询一样也不差. 有了IQueryable<T>, 某些情况下我们可能就要和匿名类打交道了.
1 2
【内容导航】
第1页: 概述 第2页: 概述
©版权所有。未经许可,不得转载。
[责任编辑:nancy]
[an error occurred while processing this directive]