我有一个函数,如果我为它提供一个0的id,我想发回一个json数组的人。
[
{
"firstname": "santa",
"lastname": "claus",
"id": 2
},
{
"firstname": "john",
"lastname": "smith",
"id": 1
}
]
如果我提供它并且id为1,我想只发回一个条目,没有数组。
{
"firstname": "john",
"lastname": "smith",
"id": 1
}
使用jsonresult,我可以轻松地重命名和选择属性,而不将其映射到类。
阵列版本有效。但是,我无法弄清楚单一的反应。我试过方法:
是否可以使用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)
答案 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,并且只有在有多个结果时才会抛出异常。