2009-05-27 17 views
2

Ich versuche, etwas ähnliches zu diesem Beispielcode von Phil Haack zu VB zu tun, und LINQ Orderby gibt mir Probleme - und ich kann nicht herausfinden, wie das geht. Ganze Methode für Compleynes gepostet.LINQ - Dynamic OrderBy in VB.Net

Dies ist die C# -Version:

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); 
    } 

mit dieser Linie Mein Problem ist ...:

var questions = context.Questions.OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize); 

In VB.Net SortiertNach akzeptiert keine einen String als Wert - und es scheint, um das in C# zu tun (oder ich vermisse etwas).

(Bitte nicht die Verwendung von VAR ist hier nicht das Thema, ich habe das abgedeckt :).)

Edit: Dies ist der Fehler, den ich bekommen (ich kann einfach nicht kompilieren):

Überlastung Auflösung fehlgeschlagen, da nicht zugänglich ‚OrderBy‘ kann mit diesen Argumenten aufgerufen werden ...

Screenshot von kompletter Fehlermeldung: alt text http://i39.tinypic.com/u0wg0.png

Edit2:

Weitere Informationen, wie angefordert. Sidx enthält den Namen einer Spalte zu sortieren, indem sord ASC- oder DESC enthält

Die VB-Code:

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

Was ist der Fehler, die Sie sehen, ? – shahkalpesh

+0

Nur ein wenig mehr Informationen in der ursprünglichen Frage hinzugefügt. :) – Kjensen

+0

Was enthalten die Strings Sidx und Sord? – CoderDennis

Antwort

3

mit Ist es möglich, dass er Dynamic Linq? Bei der dynamischen Linq benutzt dich Zeichenfolge an die OrderBy Methoden sowie viele andere der IEnumerable Erweiterungsmethoden passieren kann.

+0

Ja, das war's! Ich möchte nicht mehr externe Elemente in das Projekt aufnehmen, also werde ich nach einer anderen Möglichkeit suchen, dies zu tun. – Kjensen

0

SortiertNach nimmt einen Lambda-Ausdruck; In diesem Fall hat C# von der übergebenen Zeichenfolge abgeleitet. VB, kann anscheinend diese Schlussfolgerung nicht machen.

Try OrderBy(Function(str) sidx + " " + sord)

+0

Außer, dass in VB ist es vorzuziehen, & für String-Verkettung zu verwenden, obwohl + funktioniert. – RolandTumble

+0

Entschuldigung. C# -Entwickler hier. :) Ich versuche nur zu helfen. – Randolpho

+0

Danke für die Vorschläge, Randolpho. Es hat aber nicht funktioniert. – Kjensen

1

Ich habe versucht, das gleiche wie Kjensen zu machen, aber ich hatte viele Probleme (einschließlich der Tatsache, dass das ursprüngliche C# -Sample einige Bugs hat: die Seiten werden einige Ergebnisse nicht berücksichtigt). Also entschied ich, das Sample von Phil Haack (http://haacked.com/archive/2009/04/14/using-jquery-grid-with-asp.net-mvc.aspx) mit gespeicherten Prozeduren zu modifizieren (ich vertraue nie auf eine ORM-Sache, die SQL-Code erzeugt, die gespeicherte Prozedur ist nicht die beste, aber weder der Code von Linq) noch vb. net (i reinigen haben nicht den Code und einige Kommentare sind in Spanisch)

SQL-Code

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-Code

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