三层里做复杂的多表联合查询搜索是怎么做的?搜索的话还要有分页的,记录数统计等,能不能提供一个思路或代码。如果直接返回DataSet到UI层的话好像对层次间的划分显的混乱了。

解决方案 »

  1.   

    这个跟层有什么关系,你在数据层一样处理就好啦,sql,ds......
      

  2.   

    那是不是要拼接sql语句,而且如果涉及到多表查询联合和多个实体类的话就有些麻烦。
      

  3.   

    结果显示和你的多层没什么关系的
     分层是为了什么?
     解耦合还是??????
     页面所呈现出的全是你sql所查询出来的东西
      就算在多的表你只要在sql上动手术就OK了
      

  4.   

    给你个思考提示:SqlDataSource是“两层”的,而ObjectDataSource才是“三层”的。
      

  5.   

    我也是初学三层, 看过一些关于三层的文章. 我的做法是一个Model层,一个DAL层,一个BLL层,然后就是页面一个UI层,UI层的东西都是从BLL层取,取得的都是Model或List<Model>,BLL层则根据UI则的需求产生建立相关应方法并做适当的缓存,BLL层中没有相应的缓存时则向DAL层要,DAL层也是返回Model或List<Model>,当然也有些返回BOOL或String的。 不知道我的这种做法对不对。
      

  6.   

    我看过些别人的三层源码,好像在一些复杂查询的时候都不是返回List<Model>了,直接返回DataSet或DataTable到了UI层。我觉得那样好像那样破坏了三层该有的清晰度。
      

  7.   


    返回List跟返回DataTable到UI层进行绑定。你觉得这两个有差别吗?还不都是数据源结果。
      

  8.   

    查询可能会联系到2-3个表甚至更多, 也就是关联到几个不同的实体对象上。还要求有分页,总记录数等。如果用List<Model>的方式根据需求返回到UI层, 且这个需求是多变的,因为用户随时都可能指定,或不指定这个搜索条件。
      

  9.   

    好像多表查询无法返回List <Model>吧
    因为没有对应的实体类啊
    我是直接返回DataTable
      

  10.   

    这些没什么啊,主要还是Sql语句的问题
    多看看grouping,computing等语法,来实现分组聚合查询
      

  11.   

    MARKSP1234别给个引子啊,还是不大明白你说的意思
      

  12.   


    sql语句我是知道查,但是如何根据不同的搜索条件返回强类型. 到UI页呢. 且搜索可能是关联第多个表,也就是会有多个实体类. 还要分页, 统计查询到的记录数量等.
      

  13.   

    有时候是根据需要,并不是说就不能使用DataSet.
    弱类型的有时候比强类型的有优势。
    比如你在存储过程封装了一个查询,逻辑层根本不知道它是什么类型,这样的情况弱类型就是最好的
    需求是第一位的
      

  14.   

    补充一下:直接返回dataset也并不会破坏架构吧?处理的方式都是一样的啊.也是在业务层返回dataset,并不是直接在UI里调用数据层
      

  15.   

    只能用拼接sql语句返回DataSet到UI层去绑定?
      

  16.   


    如果你觉得这逻辑层拼接SQL不合适那就变通一下,一个值得数组到数据层,然后根据值序列在数据层中做拼接的操作
      

  17.   

    没有区别的.你要的目的还是要提取数据.然后在UI显示吗.你就用DATASET保存起来啊.
    在对DATASET进行操作不就可以了,3层是一个概念,就你的需要,你分几层都可以啊.
      

  18.   

    那是不是要写一个通用的存储过程来根据查询拼接sql语句返回列表呢, 谁有没有相关的代码贴个看看.
      

  19.   

    只要sql语句的拼接是我们在程序里面严格控制的 而不是直接接受用户的输入(比如我们拼接的依据对应的是下拉框的选择 这样用户无法得到我们设定之外的sql语句) 这个时候就没有什么不可以的了 以上是在安全角度再有 多表查询也可以返回实体 只要你在实体类里面加入除表结构之外的特定属性就可以了啊(比如文章表中 有作者id这个属性是原本的表结构中的字段 而对于"文章"而言 "作者名"仍然也是它的一个属性 这里就涉及到作者表的信息了) 构造函数进行重载以得到不同情况下的对象实体最后 支持一下22#的说法
      

  20.   

    返回datatable或是dataset时,是不允许关闭数据库的连接的。如果网络阻塞,则数据库连接是不会被关闭的。占用的资源也不会释放。在业务层封装每条记录到arraylist,可以及时的关闭数据库连接。释放占用的资源。只返回arraylist就可以了。