JQGrid القابل للفرز باستخدام LINQ إلى MySQL (DBLINQ) و Dynamic LINQ - Orderby لا يعمل
-
28-09-2019 - |
سؤال
لقد واجهت مشكلة في فرز الإدخالات في JQGrid. يبدو أن Orderby لا يعمل. لقد قمت بتعيين نقطة التوقف في الكود ولاحظت ، أن Orderby لا يغير ترتيب العناصر. أي فكرة عما يمكن أن يكون الخطأ؟
أنا أستخدم LINQ إلى SQL مع MySQL (مشروع DBLINQ).
رمز العمل الخاص بي:
public ActionResult All(string sidx, string sord, int page, int rows)
{
var tickets = ZTRepository.GetAllTickets().OrderBy(sidx + " " + sord).ToList();
var rowdata = (
from ticket in tickets
select new {
i = ticket.ID,
cell = new String[] {
ticket.ID.ToString(), ticket.Hardware, ticket.Issue, ticket.IssueDetails, ticket.RequestedBy, ticket.AssignedTo, ticket.Priority.ToString(), ticket.State
}
}).ToArray();
var jsonData = new
{
total = 1, // we'll implement later
page = page,
records = tickets.Count(),
rows = rowdata
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
المحلول
حاول بما يلي
public ActionResult All(string sidx, string sord, int page, int rows)
{
IQueryable<Ticket> repository = ZTRepository.GetAllTickets();
int totalRecords = repository.Count();
// first sorting the data as IQueryable<Ticket> without converting ToList()
IQueryable<Ticket> orderdData = repository;
System.Reflection.PropertyInfo propertyInfo =
typeof(Ticket).GetProperty (sidx);
if (propertyInfo != null) {
orderdData = String.Compare(sord,"desc",StringComparison.Ordinal) == 0 ?
(from x in repository
orderby propertyInfo.GetValue (x, null) descending
select x) :
(from x in repository
orderby propertyInfo.GetValue (x, null)
select x);
}
// if you use fields instead of properties, then one can modify the code above
// to the following
// System.Reflection.FieldInfo fieldInfo =
// typeof(Ticket).GetField (sidx);
// if (fieldInfo != null) {
// orderdData = String.Compare(sord,"desc",StringComparison.Ordinal) == 0 ?
// (from x in repository
// orderby fieldInfo.GetValue (x, null) descending
// select x) :
// (from x in repository
// orderby fieldInfo.GetValue (x, null)
// select x);
//}
// paging of the results
IQueryable<Ticket> pagedData = orderdData
.Skip ((page > 0? page - 1: 0) * rows)
.Take (rows);
// now the select statement with both sorting and paging is prepared
// and we can get the data
var rowdata = ( from ticket in tickets
select new {
id = ticket.ID,
cell = new String[] {
ticket.ID.ToString(), ticket.Hardware, ticket.Issue,
ticket.IssueDetails, ticket.RequestedBy,
ticket.AssignedTo, ticket.Priority.ToString(),
ticket.State
}
}).ToList();
var jsonData = new {
total = page,
records = totalRecords,
total = (totalRecords + rows - 1) / rows,
rows = pagedData
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
هنا أفترض أن نوع كائن التذكرة الخاص بك هو Ticket
.
نصائح أخرى
ال tickets
يتم طلب المتغير ، ولكن بعد ذلك تستخدم ذلك كمصدر لاستعلام آخر لم يتم طلبه ، بحيث يكون الترتيب غير محدد. تريد Orderby على استعلام LINQ الثاني.
لا تنتمي إلى StackOverflow