技术开发 频道

整合Java 6脚本、Groovy实现动态 MVC模式(二)


3.用户搜索模块的实现

现在回到我们的网站,作为一个网络书店,最重要的一点是,让用户迅速找到自己想要的书,另一方面,书店也要不断的通过更新数据来留住顾客用户,比如设立排行榜,每天都放置一些特价图书等等,下面我将详细介绍LINQ是如何实现这两方面内容的。

用户搜索模块
一般来说,网站会提供一个搜索框,然后用户输入关键字用于对作者、标题或者简介的搜索,在这里为了说明简便,我把多项搜索和到了一起,即只要关键字出现在三者之一,程序就把它们搜索出来。

public IQueryable<Tbl_book> GetSearchBooks(string keyWord)
        {
            Books books = new Books(ConnectionString);
            var searchBooks =
                from book in books.Tbl_books
                where
                (   book.Title.Contains(keyWord)||
                    book.Author.Contains(keyWord)||
                    book.Description.Contains(keyWord)
                )
                select book;
            return searchBooks;
        }

大家注意,我们在这里返回了一个IQueryable<Tbl_book>的接口,其中Tbl_book就是我们之前用SqlMetal工具生成的一个实体类,我们可以轻松地在数据显示层调用这个方法:

foreach (var tbl_book in BooksProvider.GetSearchBooks(keyWord))
{
//...
}

大家可以对比一下传统做法,就会发现代码简单了很多。

public IList GetSearchBooks(string keyWord) 
{
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
SqlCommand command = new SqlCommand("select * from tbl_books where title = @keyWord or author = @keyWord or description = @keyWord");
command.Parameters.Add("@keyWord", SqlDbType.VarChar).Value = "%" + keyWord + "%";
SqlDataReader reader = command.ExecuteReader();

//这里的Book是另外定义的tbl_Book的实体类
List<Book> retList = new List<Book>();
while (reader.Read())
{
Book book;

book.id = reader.GetInt32(0);
book.title = reader.GetString(1);
book.type_id = reader.GetInt32(2);
book.price = reader.GetDouble(3);
book.author = reader.GetString(4);
book.description = reader.GetString(5);
book.add_time = reader.GetDateTime(6);
book.user_id = reader.GetInt32(7);
book.image = reader.GetString(8);
book.clicks = reader.GetInt32(9);
book.isspecial = reader.GetInt32(10);

retList.Add(book);
}

return retList;
}


在这里,大家可能会发现这样一个问题,上面的代码都是返回了整个tbl_book表格的结构类型,但有时候我们并不需要tbl_book所有的整个字段,这些不需要的字段就造成了存储空间的浪费。举个例子,用户在修改密码时我们只要用户名和密码是否一致就可以,如果此时把整个tbl_user都返回,那么其他的字段空间都被浪费掉了,对于这种情况,我们将代码修改如下:

Books books = new Books(ConnectionString); 

var usersChangePwd =
from user in books.Tbl_users
where (
(name == user.User_name) &&
(pwd == user.User_pwd)
)
select new { user.User_name, user.User_pwd };

大家可以看到,这里返回了一个匿名类型,其中只有User_name,User_pwd这两项属性值,但这对于用户修改密码这个逻辑来说已经足够了。如果用传统方法来实现我们需要再定义一个数据类型,显得不够灵活。
同样,我们可以在数据显示层用foreach语句把数据取出来:

foreach (var user in usersChangePwd)
            {
                string user_name = user.User_name;
                string user_pwd = user.User_pwd;
        }
0
相关文章