Я пытаюсь сделать что-то похожее на этот пример кода от Фила Хаака до VB, а LINQ Orderby дает мне проблемы - и я не могу понять, как это сделать. Весь метод опубликован для полноты.
Это версия С#:
public ActionResult DynamicGridData(string sidx, string sord, int page, int rows)
{
var context = new HaackOverflowDataContext();
int pageIndex = Convert.ToInt32(page) - 1;
int pageSize = rows;
int totalRecords = context.Questions.Count();
int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
var questions = context.Questions.OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize);
var jsonData = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = (
from question in questions
select new
{
i = question.Id,
cell = new string[] { question.Id.ToString(), question.Votes.ToString(), question.Title }
}).ToArray()
};
return Json(jsonData);
}
Моя проблема с этой строкой...:
var questions = context.Questions.OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize);
В VB.Net OrderBy не принимает строку как значение - и, похоже, это делает на С# (или я чего-то не хватает).
(Пожалуйста, не используйте VAR, здесь не проблема, у меня есть это.:))
Edit: Это ошибка, которую я получаю (я просто не могу скомпилировать):
Ошибка перегрузки невозможна, поскольку с помощью этих аргументов нельзя вызвать доступный "OrderBy"...
Снимок экрана с полным сообщением об ошибке: alt text http://i39.tinypic.com/u0wg0.png
Edit2:
Дополнительная информация по запросу. sidx содержит имя столбца для сортировки по sord содержит asc или desc
VB-код:
Function MemberData(ByVal sidx As String, ByVal sord As String, ByVal page As Integer, ByVal rows As Integer) As JsonResult
Dim allRecords As IQueryable(Of Models.Member) = Me.MemberRepository.FindAllMembers
Dim currentPageRecords As IQueryable(Of Models.Member)
Dim pageIndex As Integer = page - 1
Dim pageSize As Integer = rows
Dim totalRecords As Integer = allRecords.Count
Dim totalPages As Integer = CInt(Math.Ceiling(totalRecords / pageSize))
Dim orderBy As String = sidx + " " + sord
currentPageRecords = allRecords.OrderBy(Function(m) orderBy).Skip(pageIndex * pageSize).Take(pageSize)
Dim jsonData = New With { _
.total = totalPages, _
.page = page, _
.records = totalRecords, _
.rows = New ArrayList _
}
For Each member As Models.Member In currentPageRecords
jsonData.rows.Add(New With {.id = member.MemberId, .cell = GenerateCellData(member)})
Next
Return Json(jsonData)
End Function
Возможно ли, что он использует Dynamic Linq? С динамическим linq вы можете передать строку методам OrderBy, а также многим другим из IEnumerable методы расширения.
Я пытался сделать то же самое, что и Kjensen, но у меня было много проблем (в том числе тот факт, что исходный образец С# содержит некоторые ошибки: revisitig the pages некоторые результаты оммитированы). Итак, я решил изменить образец Phil Haack (http://haacked.com/archive/2009/04/14/using-jquery-grid-with-asp.net-mvc.aspx) с использованием хранимых процедур (я никогда не верю в ORM-вещь, генерирующую SQL Код, хранимая процедура не самая лучшая, но не код из Linq) и vb.NET(я не очищаю код, а некоторые комментарии на испанском языке)
Код SQL
Create procedure getDataPage1
(@tableName as varchar(100),
@columns as varchar(200),
@columnOrder as varchar(100),
@columnOrderDirection as varchar(20),
@currentPage as int,
@pageSize as int,
@filter as varchar(2000) = '')
AS
BEGIN
-- No se debe referenciar a otras columnas Identity (para esos casos se debe hacer un conversion previa antes de hacer el INSERT INTO)
-- Version válida para Sql server 2000, usar funcion ROW_NUMBER para SQL server 2005 o posterior
-- Ejemplos de uso:
-- exec getDataPage1 'DataTarjetasProcesada', 'linea = cast(linea as varchar(100)), Tarjeta, Bloqueo, Saldo', 'Tarjeta', 'desc', 6, 800
-- exec getDataPage1 'Question', 'Id, Votes, Title', 'Title', 'desc', 2, 10
set nocount on
declare @query as nvarchar(1000)
-- Paso 1: se numera el listado
set @query = 'Select Identifier = Identity(int, 1, 1), ' + @columns +
' into #temp ' +
' from ' + @tableName +
case when @filter = '' then '' else ' where ' + @filter end +
' Order By ' + @columnOrder + ' ' + @columnOrderDirection
-- Paso 2: se toma la página de consulta
+
' select ' + @columns + ' from #temp '+
' where Identifier between ' + cast( @pageSize * (@currentPage -1) + 1 as varchar(15)) +
' and '+ cast (@pageSize*( @currentPage ) as varchar (15))
EXECUTE sp_executesql @query
set nocount off
END
Код Vb.net
Function DynamicGridData(ByVal sidx As String, ByVal sord As String, ByVal page As Integer, ByVal rows As Integer) As ActionResult
Dim context As New MvcTestApplication.modelDataContext
Dim pageIndex As Integer = Convert.ToInt32(page) - 1
Dim pageSize As Integer = rows
Dim totalRecords As Integer = context.Questions.Count()
Dim totalPages As Integer = Math.Ceiling(CDec(totalRecords) / CDec(pageSize))
' Establecemos la función de ordenación dependiendo del valor del
' parámetro "sidx", que es el campo de orden actual
' Establecemos si se trata de orden ascendente o descendente, en
' función del parámetro "sord", que puede valer "asc" o "desc"
Dim results As IMultipleResults = context.getDataPage1("Question", "Id, Votes, Title", sidx, sord, page, pageSize)
Dim questions = results.GetResult(Of Question)()
Dim jsonData = New With { _
.total = totalPages, _
.page = page, _
.records = totalRecords, _
.rows = (From question In questions _
Select New With _
{ _
.i = question.Id, _
.cell = New String() {question.Id.ToString(), question.Votes.ToString(), question.Title} _
} _
).ToArray() _
}
Return Json(jsonData)
End Function
Function MemberData(
ByVal sidx As String,
ByVal sord As String,
ByVal page As Integer,
ByVal rows As Integer) As JsonResult
Dim allRecords As IQueryable(Of Models.Member) =
Me.MemberRepository.FindAllMembers
Dim currentPageRecords As IQueryable(Of Models.Member)
Dim pageIndex As Integer = page - 1
Dim pageSize As Integer = rows
Dim totalRecords As Integer = allRecords.Count
Dim totalPages As Integer = CInt(Math.Ceiling(totalRecords / pageSize))
Dim orderBy As String = sidx + " " + sord
currentPageRecords = allRecords.OrderBy(Function(m) orderBy).Skip(
pageIndex * pageSize).Take(pageSize)
Dim jsonData = New With { _
.total = totalPages, _
.page = page, _
.records = totalRecords, _
.rows = New ArrayList _
}
For Each member As Models.Member In currentPageRecords
jsonData.rows.Add(
New With {.id = member.MemberId, .cell = GenerateCellData(member)})
Next
Return Json(jsonData)
End Function
OrderBy принимает лямбда-выражение; в этом случае С# выводит один из передаваемой строки. VB, по-видимому, не может сделать этого вывода.
Попробуйте использовать OrderBy(Function(str) sidx + " " + sord)