Spiga

不需编译让aspx页自主筛选数据绑定记录

2011-03-08 17:11 by LanceZhang, 348 visits, 收藏, 编辑

看到园友的一篇文章,说在一些企业门户站点里,我们经常会去根据需求变更来修改数据绑定的筛选条件,深有同感。而诸如企业门户这些场景一般也不用考虑什么性能之类的非业务要求,尽快的完成业务变更和尽可能少的减少网站编译更新次数却是网站技术支持团队的核心竞争力之所在。

 

不妨设想一下,如果用Store Procedure+DAL+BLL 写好的一个列表查询,如果要适应查询条件变更,则要动的地方恐怕很多,还需要重新编译,再把一堆dll更新上去。。。

 

看了“活跃的毛虫”兄弟的代码,本人也有所感悟,在此也分享一种更加“动态”的绑定方法:

 

大家知道,在.NET3.5以来,与Linq同时也提供了很多针对泛型集合的扩展方法,如Where/Take/OrderBy...等等。

 

在这样的场景中, 这些扩展方法也可以大有用场。比如下面的例子:

 

<p>
        
<asp:GridView ID="GridView1" runat="server" DataSource='<%#GetNewsData().Where(r=>r.Subject.StartsWith("aaa"))%>'>
        
</asp:GridView>

</p> 

 

public partial class About : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        DataBind();
    }

    
public static List<NewsData> GetNewsData()
    {
        List
<NewsData> result = new List<NewsData>();

        result.Add(
new NewsData() { Subject = "aaaa" });
        result.Add(
new NewsData() { Subject = "bbb" });
        result.Add(
new NewsData() { Subject = "aa22" });
        result.Add(
new NewsData() { Subject = "aa1" });

        
return result;
    }

    
public class NewsData
    {
        
private string subject;

        
public string Subject
        {
            
get { return subject; }
            
set { subject = value; }
        }
    }

} 

更加动态的实现了查询条件在aspx页内定义。

 

需要注意的是:

这种写法不适用于大型应用,每个页面实例的CPU和内存开销都不小。 而且对原始数据集合(未经筛选的数据集),最好能够做到一定的缓存,从减少不必要的IO开销。

 

 


作者:Lance ZhangLance Zhang's Tech Blog
出处:http://blodfox777.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Add your comment

7 条回复

  1. #1楼 Ivony...      2011-03-08 17:21
    我的另一个开源项目DbUtility就是专门支持这种写法的。

    这是几年前的事情了。

    现在有了EntityFramework,我们完全可以把查询构造全部搬到页面上去。而数据缓存之类的,则可以扩展EntityFramework来实现。


    至于不适合于大型应用,不明白有什么不适合。因为aspx里面的代码和cs里面的代码没有任何区别,只是编译的时机不同而已,而这个时机还可以在编译发布的时候更改的。换言之如果你写在cs文件里面可以用于大型项目,那么写在aspx文件里面一样可以,并没有什么问题。
     回复 引用 查看   
  2. #2楼[楼主] LanceZhang      2011-03-08 17:35
    @Ivony...
    因为对于大型的应用,我们肯定要根据各种查询条件分别缓存结果集(或结果集索引id)的啊,否则每个页面实例都要在内存里筛选一遍。

    我是觉得这种写法可以对已经缓存的数据集合进行在内存中的筛选和排序,完全不影响数据访问层和业务层。

    如果直接写EntityFramework的话,就是直接动态生成SQL语句了,那样的话,缓存应该是必要的吧。不知道EntityFramework的缓存扩展起来是否易于维护。

    请Ivony兄指教..
     回复 引用 查看   
  3. #3楼 Ivony...      2011-03-10 00:53
    引用LanceZhang:
    @Ivony...
    因为对于大型的应用,我们肯定要根据各种查询条件分别缓存结果集(或结果集索引id)的啊,否则每个页面实例都要在内存里筛选一遍。

    我是觉得这种写法可以对已经缓存的数据集合进行在内存中的筛选和排序,完全不影响数据访问层和业务层。

    如果直接写EntityFramework的话,就是直接动态生成SQL语句了,那样的话,缓存应该是必要的吧。不知道EntityFramework的缓存扩展起来是否易于维护。

    请Ivony兄指教..



    EntityFramework的ObjectContext也是可以自己来篡改的,这样的话你就可以在中间隔开一层来做缓存。对于IQueryable对象的缓存包装是很容易的。
     回复 引用 查看   
  4. #4楼 超人哥哥      2011-03-10 09:48
    lance的小技巧一向很好,我还记得当年为不同的主题调用有一定名字规则的js文件,lance在aspx上使用字符串拼接技术,大大简化了我在cs中将近百行代码。
     回复 引用 查看   
  5. #5楼 活跃的毛虫      2011-03-23 09:04
    这非常不错,不过据我跟踪,先进行where,order的操作,再进行Take的操作,相当于select top xxx from TTT where () order by XXXX这种.
    所以在调用时还要注意顺序.^^祝快速建立应用!
     回复 引用 查看   
  6. #6楼[楼主] LanceZhang      2011-03-24 14:47
    @活跃的毛虫
    嗯,是啊,是要按顺序来玩,呵呵
     回复 引用 查看   
  7. #7楼[楼主] LanceZhang      2011-03-24 14:48
    @超人哥哥
    大帅来顶帖了,其实那个创意一半是李军的功劳,嘿嘿
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1977435 EKtgc6Dx3NA=
无觅相关文章插件,快速提升流量