簡體   English   中英

LINQ-VB.Net中的動態訂購

[英]LINQ - Dynamic OrderBy in VB.Net

我正在嘗試執行類似於從Phil Haack到VB的此示例代碼的操作,並且LINQ Orderby給我帶來了問題-我不知道該怎么做。 張貼完整方法的完整方法。

這是C#版本:

    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不接受字符串作為值-似乎在C#中做到了(或者我遺漏了一些東西)。

(請不要在這里使用VAR不是問題,我已經介紹了。:))

編輯:這是我得到的錯誤(我根本無法編譯):

重載解析失敗,因為無法使用這些參數調用可訪問的“ OrderBy” ...

完整錯誤消息的屏幕截圖: 替代文字

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相同的操作,但是我遇到了很多問題(包括原始C#示例存在一些錯誤的事實:重新訪問頁面會忽略某些結果)。 因此,我決定使用存儲過程(我從不修改)來修改Phil Haack的示例( http://haacked.com/archive/2009/04/14/using-jquery-grid-with-asp.net-mvc.aspx )如果信任生成SQL代碼的ORM,存儲過程並不是最好的方法,但是Linq和vb的代碼都不是最好的。 凈(我還沒有清理代碼,一些注釋是西班牙語的)

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采用lambda表達式; 在這種情況下,C#從傳遞的字符串中推斷出一個。 VB顯然無法做出這種推論。

嘗試使用OrderBy(Function(str) sidx + " " + sord)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM