SELECT [t0].[PostID], [t0].[Title], [t0].[Content] FROM [dbo].[bbs_Post] AS [t0] WHERE ([t0].[CategoryID] = @p0) AND ([t0].[ParentID] = @p1) ORDER BY [t0].[PostID] DESC -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1
如果改成如下分页方式
var db = new BBSDbContext(conn);
var posts = from post in db.BBSPosts
where post.CategoryID == 1 && post.ParentID == 0
orderby post.PostID descending
select post;
db.Log = Response.Output;
rpt1.DataSource = posts.Skip(1 * 5).Take(5);
rpt1.DataBind();
会输出如下SQL
SELECT [t1].[CategoryID], [t1].[PostID], [t1].[ParentID], [t1].[Title], [t1].[Content], [t1].[PostUser], [t1].[PostTime] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY [t0].[PostID] DESC) AS [ROW_NUMBER], [t0].[CategoryID], [t0].[PostID], [t0].[ParentID], [t0].[Title], [t0].[Content], [t0].[PostUser], [t0].[PostTime] FROM [dbo].[bbs_Post] AS [t0] WHERE ([t0].[CategoryID] = @p0) AND ([t0].[ParentID] = @p1) ) AS [t1] WHERE [t1].[ROW_NUMBER] BETWEEN @p2 + 1 AND @p2 + @p3 ORDER BY [t1].[ROW_NUMBER] -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0] -- @p2: Input Int (Size = 0; Prec = 0; Scale = 0) [5] -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [5] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1
可以看到这些查询用的都是参数化查询,不是拼SQL,而且还用了ROW_NUMBER函数,LINQ TO SQL还是比较了解SQLSERVER的。
7、设置某个Action需要身份认证?
因为基于页面的授权不能使用了,我们只好对某个Action进行授权,比如要回复帖子的话需要进行登录,那么就在reply的action上加上需要身份验证的属性修饰,如下
[AcceptVerbs(HttpVerbs.Post), Authorize]
?public ActionResult reply(BBSPost post, FormCollection coll) {
这种方式是以AOP注入方式实现的,更多的拦截器示例,或者想写自己的拦截器可以google些资料看看。
8、如何把用户提交的表单数据转成强类型。
我们都知道网页上提交的数据包括Form里和QueryString,在服务端取出来都是string类型的,在asp时代,我们需要一个一个的处理参数,在ASP.NET MVC里就很方便了,比如你有一个BBSPost类,有Title和Content和CategoryId 3个属性,而表单上有两个文本框Title和Content,地址栏参数里有一个CategoryId,你可以直接在action里取到一个BBSPost类,而且属性都给你填充好了,不用你取出一个一个的string再new一个BBSPost类,再转类型赋值等一系列操作了,如下
public ActionResult reply(BBSPost post, FormCollection coll) {}
第一个参数会自动填充成强类型,第二个参数可以取出原始的表单提交的数据。如果你想了解更多的表单数据和强类型数据的绑定,细节,可以查查DefaultModelBinder是如何工作的。








