但是我没有考虑到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>, 某些情况下我们可能就要和匿名类打交道了.