如何为Json文件编写Linq查询?

时间:2012-03-29 10:57:40

标签: json linq

我需要以特定格式为json文件编写Linq查询。数据库中有3个表。 学生,有学生ID和姓名。 主题,主题ID和名称。 结果包括学生ID,学生ID,结果和结果日期。 这是我获得结果的查询

   var studentQuery = (from c in db.Students
                       join f in db.Results
                       on c.ID equals f.StudentID
                       join d in db.Subjects
                       on f.SubjectID equals d.ID
                       where c.ID == Convert.ToInt32(DropDownList1.SelectedValue)
                       select new newResult{
                                    ID = f.StudentID,
                                    Date = convertDateToUTC(f.Date.Value),
                                    Name = c.Name.Trim(),
                                    Result1 = f.Result1.Value,
                                    Type = d.Subject1.Trim()
                                })
                      .ToList();

   return studentQuery; 

但我希望在中返回查询 采用以下格式

[ { "name": "Denis P6 Results", "type": "English", "data": [ [ 1325431800000, 54 ], [ 1325691000000, 65 ], [ 1325950200000, 73 ], [ 1326209400000, 60 ] ] },

{ "name": "Denis P6 Results", "type": "Maths", "data": [ [ 1325518200000, 76 ], [ 1325777400000, 81 ], [ 1326036600000, 80 ], [ 1326295800000, 70 ] ] },

{ "name": "Denis P6 Results", "type": "Science", "data": [ [ 1325604600000, 80 ], [ 1325863800000, 75 ], [ 1326123000000, 69 ], [ 1326382200000, 68 ] ] },

{ "name": "Mak P6 Results", "type": "English", "data": [ [ 1325431800000, 57 ], [ 1325691000000, 49 ], [ 1325950200000, 66 ], [ 1326209400000, 70 ] ] },

{ "name": "Mak P6 Results", "type": "Maths", "data": [ [ 1325518200000, 80 ], [ 1325777400000, 83 ], [ 1326036600000, 85 ], [ 1326295800000, 79 ] ] },

{ "name": "Mak P6 Results", "type": "Science", "data": [ [ 1325604600000, 67 ], [ 1325863800000, 69 ], [ 1326123000000, 66 ], [ 1326382200000, 62 ] ] } ]

我真的需要一些帮助,因为我一直在搜索。我是一个新手。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

让我们将其分解为您尝试实现的每个步骤:

  1. 按人和主题对结果进行分组。
  2. 将这些渲染为JSON。
  3. 对于第一位,我们可以做类似

    的事情
    var groupedResults = from result in db.Results
                         group result by new { result.StudentID, result.SubjectID } into grouping
                         select new { grouping.Key, grouping };
    
    var resultsWithName = from result in groupedResults
                          join student in db.Students on result.Key.StudentID equals student.ID
                          join subject in db.Subjects on result.Key.SubjectID equals subject.ID
                          select new
                          {
                              result.Key,
                              student.Name,
                              subject.Type,
                              result.grouping
                          };
    

    resultsWithName现在包含一系列名称和主题对,以及一系列结果。这是第一次完成。

    您可以使用库来生成JSON,但手动操作并不是太糟糕:

    var jsonRendered = resultsWithName.Select(g =>
        string.Format("{{ \"name\" : \"{0} Results\", \"type\" : \"{1}\", \"data\" : {2} }}",
            g.Name,
            g.Type,
            "[ " + string.Join(", ", g.grouping.Select(r => string.Format("[ {0}, {1} ]", r.Date, r.Mark))) + " ]"));
    

    在这里,我们迭代所有分组结果(即每个人和每个主题),然后创建一个包含该主题结果的字符串。

    我还没有像你一样对某些变量使用相同的名称,但希望它能清楚地知道如何为你的代码调整它。

答案 1 :(得分:0)

JavaScriptSerializer serializer = new JavaScriptSerializer();
var json = serializer.Serialize(resultsWithName);

只需使用内置的.NET json序列化程序。不需要太复杂。