将标准EF列表转换为嵌套JSON

时间:2015-09-18 13:37:43

标签: asp.net json ajax serialization webmethod

我的ASPX页面中有一个WEB方法,它使用Entity Framework从SQL DB中检索List。

    Using rep As New RBZPOSEntities
        q = rep.getSalesByLocation(fDate, tDate).ToList
    End Using

此后我使用javascriptserializer将此列表转换为JSON字符串

    Dim jss As JavaScriptSerializer = New JavaScriptSerializer()
    Dim json As String = jss.Serialize(q)

所以上面的工作很好,我可以在客户端使用AJAX来成功显示结果。

我现在遇到的问题是将平面列表转换为嵌套的JSON字符串。 因此,请考虑以下列表:

locationName as string
MonthName as string
totalAmount as string

需要将其转换为这样的JSON:

[{locationName:'Tokyo',totalAmount:[100,200,300,400]},
 {locationName:'New York',totalAmount:[500,600,700,800]}]

因此,上述情况中的totalAmount值对应于特定月份的Location的totalAmounts。例如。东京1月的总金额是100,2月是200等等。

我能做什么: 我可以创建一个嵌套列表,并使用EF的结果填充它,然后序列化为JSON。

我在问什么: 还有其他更清洁的方法吗。

谢谢

2 个答案:

答案 0 :(得分:3)

正如托德已经说过你需要将你的平面列表转换成另一种中间类型的列表。让我们调用您现有的Type" InputType"和你想要的类型"输出类型"

Public Class InputClass
  Public locationName as String
  Public MonthName as String
  Public totalAmount as String
End Class

Public Class OutputClass
  Public LocationName As String
  Public TotalAmount As List(Of String)

  Public Sub New(groupedInputClass As IGrouping(Of String, InputClass))
    LocationName = groupedInputClass.Key
    TotalAmount = groupedInputClass.Select(Function(x) x.totalAmount).ToList()
  End Sub
End Class

然后你需要做的就是将一个List of InputType转换为一个OutputType列表,这对于LINQ来说非常简单。

Public Class MappingHelper
  Public Function Map (inputList as List(Of InputClass)) As List(Of OutputClass)

    Dim groupedByLocation = inputList.GroupBy(Function(k) k.LocationName)

    Dim nestedLocations = groupedByLocation.Select(Function(x) new OutputClass(x)).ToList()

    Return nestedLocations
  End Function
End Class

答案 1 :(得分:1)

如果您使用中间类型,它可能会有所帮助。类似的东西:

class RbzposInfo {
  public string Location {get;set;}
  public List<MonthlyRevenue> Monthlies {get;set;}
}

class MonthlyRevenue {
  public string Month {get;set;}
  public int Revenue {get;set;}
}

var result = new List<RbzposInfo>(); 
foreach (var r in q) {  // q from your code
   var info = new RbzposInfo();
   // TODO: put r values into info.
   result.Add(info);
}
Dim json As String = jss.Serialize(result);

(PS,对不起,我把.NET语言混合在一起。我的代码是C#。)