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



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

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

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

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

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

阵列版本有效。但是,我无法弄清楚做单一响应的热。我尝试了以下方法:

  1. 它不允许我将 .single 与"选择"选项一起使用在同一语句中定义匿名类
  2. 当我尝试使用 q(0) 时,出现以下错误:"System.MissingMemberException:"找不到类型'DbQuery(Of VB$AnonymousType_1(Of String,String,Integer))'的默认成员。

是否可以使用选择选项将单个条目发回?

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)

回想一下查询的每个部分的作用以及它的操作:

  • 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,并且仅当有多个结果时才引发异常。

最新更新