C# 获取不适当的json数据结构
我有以下数据:用户C# 获取不适当的json数据结构,c#,.net,linq,asp.net-web-api,C#,.net,Linq,Asp.net Web Api,我有以下数据:用户 UserId Name 42 Abc 43 Pqr 44 lmn 45 xyz 映射: MappingId User1 User2 1 42 43 2 42 44 3 43 44 UserId Name 42 Abc 43 Pqr var data = [{
UserId Name
42 Abc
43 Pqr
44 lmn
45 xyz
映射:
MappingId User1 User2
1 42 43
2 42 44
3 43 44
UserId Name
42 Abc
43 Pqr
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[]
},
{
"UserId": 43,
"Name": "xyz",
"Connections":[]
}];
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[43]
}];
var data =
[{
"UserId": 44,
"Name": "Almn",
"Connections":[]
}];
现在我有1个web服务,我每秒钟启动一次,以获得用户和用户的连接,并以以下格式返回json数据:
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections": [43,44]
}, {
"UserId": 43,
"Name": "Pqr",
"Connections": [44]
}, {
"UserId": 44,
"Name": "Lmn",
"Connections": []
}, {
"UserId": 45,
"Name": "xyz",
"Connections": []
}];
基本上,此web服务的目的是始终获取新用户和现有用户的新连接,这就是我启动此服务的原因
每秒钟的web服务
所以我的条件是这样的(跳过已经获取用户并获取新用户,如果有)或者(跳过已经获取连接并获取新用户)
但json数据结构应相同
因此,在每次web服务调用中,要么获取所有新用户,要么如果没有新用户,则获取已建立新连接的现有用户
用例1:
MappingId User1 User2
1 42 43
2 42 44
3 43 44
UserId Name
42 Abc
43 Pqr
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[]
},
{
"UserId": 43,
"Name": "xyz",
"Connections":[]
}];
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[43]
}];
var data =
[{
"UserId": 44,
"Name": "Almn",
"Connections":[]
}];
输出json:
MappingId User1 User2
1 42 43
2 42 44
3 43 44
UserId Name
42 Abc
43 Pqr
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[]
},
{
"UserId": 43,
"Name": "xyz",
"Connections":[]
}];
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[43]
}];
var data =
[{
"UserId": 44,
"Name": "Almn",
"Connections":[]
}];
用例2:
如果在用户42和用户43之间建立连接,则:
输出json:
MappingId User1 User2
1 42 43
2 42 44
3 43 44
UserId Name
42 Abc
43 Pqr
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[]
},
{
"UserId": 43,
"Name": "xyz",
"Connections":[]
}];
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[43]
}];
var data =
[{
"UserId": 44,
"Name": "Almn",
"Connections":[]
}];
用例3:新用户输入:
UserId Name
42 Abc
43 Pqr
44 lmn
输出json:
MappingId User1 User2
1 42 43
2 42 44
3 43 44
UserId Name
42 Abc
43 Pqr
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[]
},
{
"UserId": 43,
"Name": "xyz",
"Connections":[]
}];
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[43]
}];
var data =
[{
"UserId": 44,
"Name": "Almn",
"Connections":[]
}];
用例4:用户42和44之间的连接:
var data =
[{
"UserId": 42,
"Name": "Abc",
"Connections":[42,44]
}];
这是我的代码:
public HttpResponseMessage GetUsers([FromUri]Int32 skip = 0)
{
var userBll = new UserBLL();
var result = context.Users.ToList();
var lists = new List<string>();
var connectionsData = context.Mappings.ToList().OrderBy(t => t.CreatedDate.Value.Date).ThenBy(t => t.CreatedDate.Value.TimeOfDay).Skip(skip).Take(1);
lists.Add(connectionsData.FirstOrDefault().User1 + "," + connectionsData.FirstOrDefault().User2);
var response = Request.CreateResponse(HttpStatusCode.OK, result.Select(r => new
{
UserId=r.UserId,
Name = r.FirstName + " " + r.LastName,
Connections = lists
}));
return response;
}
Javascript代码:
var userList = [];
function GetData() {
$.getJSON('Url', {skip:userList.length} ,function (response) {
updateUserList(response);
});
}
function updateUserList(data) {
if (JSON.stringify(userList).toString() != JSON.stringify(data).toString()) { //if old data is not same as new data
userList = data;
}
else
{
setTimeout(GetData, 1000); //fire request every 1 seconds
}
}
注意:我没有外键关系。假设
连接的类型是IEnumerable
您有一个ucontext
和一个context
——所以这些表保存在不同的数据库中,还是只保存在两个不同的上下文中?另外,connections
在用于设置connections
属性之前未声明。但是你的问题的关键是你没有从用户
加入到映射
,所以每个用户
都显示了相同的映射的第一条记录
@strickt01:很抱歉,这是一个错误,谢谢你指出。问题已更新。请检查我知道这是离题,但如果您需要向javascript客户端进行实时数据广播,我建议您查看SignalR。每隔一秒ping一个API在将来将是一个问题。我认为您需要修改您的数据模型。可能会添加一个新表(例如:Activities
),用于保存用户之间的新登录和新连接。在该表中,您可以有一个Seen
位字段,指示此字段是否已发送到javascript客户端。@了解每次您有新登录或映射时,请在Activities
中插入一行,其中Seen
默认为0<代码>活动
可以有一个关于
字段,您可以在其中粘贴映射或登录的ID
和一个活动类型
字段,告诉您它是否是新映射/登录。您每秒ping的API将是从活动中获取信息的API。抱歉,我没有设置外键,因此没有导航属性如果您注意到我在javascriptOK中调用我的web服务时传递了旧记录计数器,即userlist.length,我已经删除了导航属性的使用,并使用了Where
子句。我还添加了你的Skip
,虽然我不确定这是否会给你带来你想要的结果,而且可能效率低下。这就是我之前提到的关于你没有办法了解新用户的观点。在映射
上有此跳过
,但在用户
上没有,但不能同时使用一个变量。正如@Francis Ducharme所解释的,当创建新用户或连接时,您需要一种审计方法,以便在调用您的服务时,您可以计算出自上次调用以来发生了什么变化。我同意ping您的服务是非常低效的,所以在这个用例中,signal将是一个很好的选择。在建立该用户/连接时,您至少需要在两个表中保持一致。在这种情况下,rowversion
(您使用的是SQL Server吗?)可能是最好的选择。然后,每次都可以将其传递回以生成新记录。