2009-05-27 40 views
2

我想做一些类似于这个示例代码从菲尔哈克到VB,和LINQ Orderby给我的问题 - 我不知道如何做到这一点。整个方法发布为completenes。LINQ - 动态OrderBy在VB.Net

这是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排序依据不接受字符串作为价值 - 它似乎在C#中做到这一点(或者我错过了一些东西)。

(请不使用VAR不是这里的问题,我有一个覆盖:))。

编辑: 这是我得到(我根本无法编译)错误:

重载决策失败,因为没有可访问的“排序依据”可以用这些参数调用...

截图完整的错误消息:alt text http://i39.tinypic.com/u0wg0.png

编辑2:

根据要求提供更多信息。 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

什么是您所看到的错误? – shahkalpesh 2009-05-27 19:28:49

+0

只是在原始问题中增加了一些信息。 :) – Kjensen 2009-05-27 19:37:01

+0

字符串sidx和sord包含什么? – CoderDennis 2009-05-27 19:53:11

回答

3

尝试是否有可能他用Dynamic Linq?使用动态LINQ可以传递字符串的排序依据的方法,以及许多其他的IEnumerable的扩展方法。

0

排序依据需要lambda表达式;在这种情况下,C#从被传递的字符串中推断出一个。 VB,显然不能做出推断。

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

1

我试图做同样的Kjensen,但我有很多问题(包括原始的C#示例有一些错误的事实:重新访问一些结果ommited页)。所以,我决定使用存储过程修改Phil Haack样本(http://haacked.com/archive/2009/04/14/using-jquery-grid-with-asp.net-mvc.aspx)(我从不相信ORM产生SQL代码,存储过程不是最好的,但是既不是来自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 
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