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吗?)可能是最好的选择。然后,每次都可以将其传递回以生成新记录。