2016-04-29 2 views
1

を取得する私は、このデータを持っている:ユーザー不適切なJSONデータカルコゲノフルバレン骨格

UserId Name 
42  Abc 
43  Pqr 
44  lmn 
45  xyz 

マッピング

MappingId User1 User2 
1   42 43 
2   42 44 
3   43 44 

今、私は、ユーザーとユーザーを取得するために、すべての秒を発射する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

UserId Name 
42  Abc 
43  Pqr 

出力JSON

var data = 
     [{ 
      "UserId": 42, 
      "Name": "Abc", 
      "Connections":[] 
     }, 
     { 
      "UserId": 43, 
      "Name": "xyz", 
      "Connections":[] 
     }]; 

ユースケース2: 接続は、ユーザ42とユーザ43との間に形成されている場合: 出力json

var data = 
     [{ 
      "UserId": 42, 
      "Name": "Abc", 
      "Connections":[43] 
     }]; 

ユースケース3:新しいユーザーが入力:

UserId Name 
42  Abc 
43  Pqr 
44  lmn 

出力JSON

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; 
     } 

しかし、入力データの下での出力の下に取得:

UserId Name 
42  Abc 
43  Pqr 
44  lmn 
45  xyz 


MappingId User1 User2 
1   42 43 

var data = 
     [{ 
      "UserId": 42, 
      "Name": "Abc", 
      "Connections": [42,43] 
     }, { 
      "UserId": 43, 
      "Name": "Pqr", 
      "Connections": [42,43] 
     }, { 
      "UserId": 44, 
      "Name": "Lmn", 
      "Connections": [42,43] 
     }, { 
      "UserId": 45, 
      "Name": "xyz", 
      "Connections": [42,43] 
     }]; 

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 
      } 
     } 

は誰がこれで私を助けることはできますか?

注::私は外来キーの関係は持っていません。

+1

あなたは 'ucontext'と' context'を持っています - テーブルは別々のデータベースか二つの異なるコンテキストに保持されていますか?また、 'connections'プロパティを設定する前に' connections'を宣言していません。しかし、あなたの問題の要点は 'User'から' Mappings'に参加していないので、 'User'はすべて' Mappings'の同じ最初のレコードを表示しているということです。 – strickt01

+0

@ strickt01:ご迷惑をおかけしましたが、ご指摘いただきありがとうございます。質問が更新されました。 –

+2

を確認してください。これはトピックではありませんが、javascriptクライアントにリアルタイムデータブロードキャストが必要な場合はSignalRを調べることをおすすめします。 APIを1秒ごとにpingすることは、今後問題になります。 –

答えて

1

ConnectionsのタイプをIEnumerable<int>とすると、

context.Users.Select(r => new 
      { 
       UserId =r.UserId, 
       Name = r.FirstName + " " + r.LastName, 
       Connections = context.Mappings.OrderBy(t => t.CreatedDate.Value).Skip(skip).Where(m => m.User1 == r.UserId).Select(m => m.User2) 
        .Concat(context.Mappings.OrderBy(t => t.CreatedDate.Value).Skip(skip).Where(m => m.User2 == r.UserId).Select(m => m.User1)) 
      }); 
+0

外部キーを設定していないため、ナビゲーションプロパティはありません –

+0

Webサービスを呼び出すときに古いレコードカウンタ、つまりuserlist.lengthを渡しています。 javascript –

+1

OK、ナビゲーションプロパティの使用を削除し、Where句を使用しました。私はあなたの望む結果をあなたに提供し、効率が悪いかもしれませんが、あなたの 'Skip'を追加しました。 – strickt01