using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Text.RegularExpressions;

namespace BookDemo.QA
{
    public partial class SearchResult : System.Web.UI.Page
    {
        //创建BookDemoEntities实例，用于Linq to Entities操作
        BookDemoEntities ctx = new BookDemoEntities();
        //搜索关键字
        protected string KeyWord { get; set; }
        //URL编码后的关键字
        protected string KeyWordUrlEnCode { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                return;//如果是回传，则返回，不继续执行下面的代码
            }

            if (!string.IsNullOrEmpty(Request.QueryString["kw"]))
            {
                KeyWord = Server.UrlDecode(Request.QueryString["kw"].Trim());//URL解码后的关键字
                Master.Keyword = KeyWord;//设置母版页关键字
                lblKeyword.Text = KeyWord;//显示关键字

                //过滤关键字：'&$#@!~<>=,/|\
                //转义关键字： .$ ^ { [ ( | ) * + ? \ 
                Regex regexFilter = new Regex(@"(['&$#@!~<>=,/|\\])");//需要过滤的关键字
                Regex regexKey = new Regex(@"([.$^{[(|)*+?])");//需要转义的正则表达式符号
                KeyWord = regexFilter.Replace(KeyWord, "");//替换禁止查询字符
                KeyWord = regexKey.Replace(KeyWord, @"\$1");//替换关键字转义
                KeyWordUrlEnCode = Server.UrlDecode(KeyWord);//原始的URL编码过的关键字
            }
            DateTime dtStartSearch = DateTime.Now;//开始搜索时间
            var result = (from q in ctx.QAQuestion//从QAQuestion中查询
                                       .Include("QAAnswer")//关联查询QAAnswer
                                       .Include("QACatalog")//关联查询QkACatalog
                                       .Include("QAUserInfo")//关联查询QAUserInfo
                          from a in q.QAAnswer//同时关联查询QAQAAnswer
                          where
                          (q.Title.Contains(KeyWord)//提问标题中包含关键字
                          || q.Text.Contains(KeyWord)//或 提问内容中包含关键字
                          || a.Text.Contains(KeyWord)//或 回答内容中包含关键字
                          )
                          && q.State == 1//提问状态必须为“已解决”
                          && a.BestAnswer == true//回答状态必须为“最佳答案”
                          orderby a.PostDatetime descending//按照最佳回答的时间倒序排列
                          select new
                          {
                              Question = q,//查询返回“提问”内容
                              Catalog = q.QACatalog,//查询返回“提问”对应的目录
                              Answer = a,////查询返回“提问”对应的“最佳答案”
                              AnswerUserInfo = a.QAUserInfo////查询返回“最佳答案”对应的用户信息
                          }
                          ).ToList();//转为List<T>类型，此类型为匿名类型
            DateTime dtFinishSearch = DateTime.Now;//搜索结束时间
            lblSearchCost.Text = (dtFinishSearch - dtStartSearch).TotalMilliseconds.ToString();

            //显示结果条数
            //注：如果用到了分页，这里不能直接从result.Count获取总共记录的条数
            lblResultCount.Text = result.Count.ToString();

            rptResult.DataSource = result;//将result作为rptResult的数据源
            rptResult.DataBind();//将数据绑定到rptResult上
        }
    }
}
