LINQ - динамический порядок в VB.Net

2

Я пытаюсь сделать что-то похожее на этот пример кода от Фила Хаака до 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
  • 0
    Какую ошибку вы видите?
  • 0
    Просто добавили немного больше информации в исходный вопрос. :)
Показать ещё 3 комментария
Теги:
linq

4 ответа

3
Лучший ответ

Возможно ли, что он использует Dynamic Linq? С динамическим linq вы можете передать строку методам OrderBy, а также многим другим из IEnumerable методы расширения.

  • 0
    Да это оно! Я не хочу включать больше внешних элементов в проект, поэтому я буду искать другой способ сделать это.
1

Я пытался сделать то же самое, что и 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
0
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
0

OrderBy принимает лямбда-выражение; в этом случае С# выводит один из передаваемой строки. VB, по-видимому, не может сделать этого вывода.

Попробуйте использовать OrderBy(Function(str) sidx + " " + sord)

  • 0
    За исключением того, что в VB предпочтительно использовать & для конкатенации строк, хотя + работает.
  • 0
    Сожалею. Разработчик C # здесь. :) Просто пытаюсь помочь.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню