【问题标题】:How to implement paging in mvc with sql query如何在mvc中用sql查询实现分页
【发布时间】:2017-11-07 09:51:29
【问题描述】:

您好,我有一个在 sql server 中进行的查询,如下所示,sp 名称为 sp_StudentRequest

Select DISTINCT SR.StudentRequestId,SR.RegistrationId,SR.Location,SR.PaymentMethod,SR.CreatedOn,C.ClassName,CC.CampusName,
CASE WHEN ISNULL(TSR.StatusId,0)=0 THEN 1 ELSE TSR.StatusId END AS StatusId,
 substring(
(
    Select ', '+REPLACE(REPLACE(ST1.FromTime,'AM',''),'PM','')+'-'+ST1.ToTime AS [text()]
    From dbo.StudentRequestTimings ST1
    Where ST1.StudentRequestId = SRT.StudentRequestId
    ORDER BY ST1.CreatedOn
    For XML PATH ('')
), 2, 1000) [Time]
FROM StudentRequest SR
Inner JOIN Registration R ON R.RegistrationId=SR.RegistrationId
INNER JOIN Campus CC ON CC.CampusId=R.CampusId
INNER JOIN Class C ON C.ClassId=SR.ClassId 
LEFT JOIN TutorClasses TC ON SR.ClassId=TC.ClassId
LEFT JOIN StudentRequestTimings SRT ON SR.StudentRequestId=SRT.StudentRequestId
LEFT JOIN TutorStudentRequest TSR ON TSR.StudentRequestId=SRT.StudentRequestId AND TutorId=@RegistrationId
where TC.RegistrationId=@RegistrationId
ORDER BY SR.CreatedOn DESC

我从控制器调用此代码为

public ActionResult TutorDashboard(int? page)
        {               
                    using (SqlConnection con = new SqlConnection(constr))
                    {
                        using (SqlCommand cmd = new SqlCommand("sp_StudentRequest"))
                        {

                            DataSet GetData = new DataSet();
                            cmd.Connection = con;
                            con.Open();
                            cmd.Parameters.AddWithValue("@Operation", "GetTutorRequestDetail");
                            cmd.Parameters.AddWithValue("@RegistrationId", 1);

                            cmd.CommandType = CommandType.StoredProcedure;
                            SqlDataAdapter ad = new SqlDataAdapter(cmd);
                            ad.Fill(GetData);
                            if (GetData.Tables[0].Rows.Count > 0)
                            {
                                ViewBag.TutorRequest = GetData.Tables[0].ToPagedList(page ?? 1, 1);
                            }  
                            con.Close();
                        }
                    }
            return View(ViewBag.TutorRequest);
        }

现在我需要tom在PagedList的帮助下实现MVC中的分页,我该怎么做?

如果我不能使用这个 sql 查询,那么在实体框架中转换这个查询的方法是什么?

任何帮助都会对我有用。

【问题讨论】:

  • 您需要将数据投影到模型中,而不是 DataSet
  • @StephenMuecke 在模型中获取数据我需要实现实体/linq 查询对吗?或者我们可以直接从sql查询中获取数据并填写模型?
  • 您可以使用DataReader 来读取结果。但是就像使用DataSet 一样,因为您下载了所有数据,所以它破坏了服务器端分页的全部目的。将 EF 与 linq 一起使用是最好的方法(.ToPagedList()` 在内部使用 .Skip() 和 .Take() 来生成只返回您需要的记录的 sql 查询)
  • 但是,如果您确实希望使用您的 sp,则为 OFFSET 和 NEXT 添加其他参数(例如,请参阅 this answer(然后使用 DataReader 来投影结果)进入模型)
  • @StephenMuecke 你能帮我把这个 sql 查询作为 linq/entity 查询吗?

标签: c# sql-server asp.net-mvc


【解决方案1】:

为了应用分页,我已经在实体框架中转换了我的查询,下面是代码

var query = (from sr in db.StudentRequests
             join r in db.Registrations on sr.RegistrationId equals r.RegistrationId
             join cc in db.Campus on r.CampusId equals cc.CampusId
             join c in db.Classes on sr.ClassId equals c.ClassId
             from tc in db.TutorClasses.Where(t => t.ClassId == sr.ClassId).DefaultIfEmpty()
             from srt in db.StudentRequestTimings.Where(s => s.StudentRequestId == sr.StudentRequestId).DefaultIfEmpty()
             from tsr in db.TutorStudentRequests.Where(t => t.StudentRequestId == srt.StudentRequestId && t.TutorId == registrationid).DefaultIfEmpty()
             where tc.RegistrationId == registrationid
             select new
             {
               StudentRequestId = sr.StudentRequestId,
               RegistrationId = sr.RegistrationId,
               Location = sr.Location,
               PaymentMethod = sr.PaymentMethod,
               CreatedOn = sr.CreatedOn,
               ClassName = c.ClassName,
               CampusName = cc.CampusName,
               StatusId = tsr.StatusId == null ? 1 : tsr.StatusId,
               Time = db.StudentRequestTimings.Where(p => p.StudentRequestId == sr.StudentRequestId).Select(p => p.FromTime.ToString().Replace("AM", "").Replace("PM", "") + "-" + p.ToTime)
               }).ToList().GroupBy(p => new { p.StudentRequestId }).Select(g => g.First()).ToList();


          var model = query.AsEnumerable().Select(x => new TutorDashboard
           {
              StudentRequestId = x.StudentRequestId,
              RegistrationId = x.RegistrationId,
              Location = x.Location,
              PaymentMethod = x.PaymentMethod,
              CreatedOn = x.CreatedOn,
              ClassName = x.ClassName,
              CampusName = x.CampusName,
              StatusId = x.StatusId == null ? 1 : x.StatusId,
              Time = string.Join(",", x.Time),
               }).ToList().ToPagedList(page ?? 1, 1);

最后我在视图侧通过了这个模型。

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 2020-04-11
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多