The project (web application) I am refering to has I guess two sections. One section is the admin section. i.e. only a few people have access to this section. So here I have used the SQL Datasource for CRUD operations.
The second section where many people may access at the same time, I have implemented a DAL, BLL and Entities (i.e. class representing a table). For binding to a datagrid I have used datasets. The dataset is returned from a class in the BLL, which in turn calls into the DAL. I have also sometimes created a relation in a dataset and then bind it to an Infragistics grid to display hierachical data.
I have not used much cacheing or transactions but have used session variables.
I can give more details, if required.