如何使用select选项从vb.net linq查询发送单个json响应

时间:2018-01-17 20:02:04

标签: json vb.net linq

我有一个函数,如果我为它提供一个0的id,我想发回一个json数组的人。

[
    {
      "firstname": "santa",
      "lastname": "claus",
      "id": 2
    },
    {
      "firstname": "john",
      "lastname": "smith",
      "id": 1
    }
  ]

如果我提供它并且id为1,我想只发回一个条目,没有数组。

{
  "firstname": "john",
  "lastname": "smith",
  "id": 1
}

使用jsonresult,我可以轻松地重命名和选择属性,而不将其映射到类。

阵列版本有效。但是,我无法弄清楚单一的反应。我试过方法:

  1. 它不允许我使用.single和“select”选项在同一个语句中定义匿名类
  2. 当我尝试使用q(0)时,我收到以下错误:'System.MissingMemberException:'找不到类型'DbQuery(Of VB $ AnonymousType_1(Of String,String,Integer))'的默认成员。'
  3. 是否可以使用select选项发回一个条目?

     Function get_people_jsonresult(Optional id As Integer = 0) As JsonResult
            Dim q As Object
            If id = 0 Then
                q = From c In db.dtb_people.OrderBy(Function(x) x.c_lastname).ToList Select New With {
                .firstname = c.c_firstname,
                .lastname = c.c_lastname,
                .id = c.c_Id
                }
                Return Json(q, JsonRequestBehavior.AllowGet)
            ElseIf id = 1 Then
                'how do I do a single request? .single doesn't work vs. tolist
                q = From c In db.dtb_people.Where(Function(x) x.c_Id = id).Single Select New With {
                .firstname = c.c_firstname,
                .lastname = c.c_lastname,
                .id = c.c_Id
                }
                'is it possible to select the first entry before being sent back here?
                Return Json(q(0), JsonRequestBehavior.AllowGet)
    
            End If
    
        End Function
    

    更新。我发现可以通过这种方式进行匿名课程,但是如果可能的话,仍然很好奇,可以在与单一语句相同的语句中进行:

    Dim c As dtb_people = db.dtb_people.Where(Function(x) x.c_Id = 1).Single
    
    Return Json(New With {
         .firstname = c.c_firstname,
         .lastname = c.c_lastname,
         .id = c.c_Id.ToString
         }, JsonRequestBehavior.AllowGet)
    

1 个答案:

答案 0 :(得分:0)

回想一下查询的每个部分以及它的运作方式:

  • Where()根据某些条件筛选可枚举项,生成仅包含匹配元素的新枚举。
  • Single()对可枚举进行操作以将其减少为单个元素(因此结果不再可枚举)。
  • Select()对一个枚举进行操作,将每个元素转换为一个新形式,生成一个包含新元素的新枚举。

您正在尝试使用Single从表中获取单个元素,然后然后 Select将其转换为其他形式。这不会起作用,因为Select不会对单个元素进行操作。它以可枚举的方式运行。因此,您需要在此处更改操作顺序。

请尝试这样:

    q = (From c In db.dtb_people.Where(Function(x) x.c_id = id) Select New With {
       .firstname = c.c_firstname,
       .lastname = c.c_lastname,
       .id = c.c_id
    }).Single()

注意我已将整个From表达式括在括号内,直到Select部分的末尾,然后在结束时应用Single

注意:如果您查询的id可能不存在于数据库中,您可能希望使用SingleOrDefault()而不是Single()。如果没有一个结果(即,如果没有结果或多于一个结果),Single()将抛出异常。如果没有结果,SingleOrDefault()将返回null,并且只有在有多个结果时才会抛出异常。