我有一个让所有朋友上网的功能,现在我想在Json字符串中添加一个名为 ProfilePic 的额外值。
使用下面的代码,我得到了朋友ID。 ProfilePic值位于UserDTO中,数据库中的列名称为ProfilePic
我的问题是我不知道如何在json字符串中获取该值。
public override Task OnConnected()
{
// Init db
Db db = new Db();
// Get user id
UserDTO userDTO = db.Users.Where(x => x.Username.Equals(Context.User.Identity.Name)).FirstOrDefault();
int userId = userDTO.Id;
// Get all online ids
List<int> onlineIds = db.Online.ToArray().Select(x => x.Id).ToList();
// Get friends ids
List<int> friendIds1 = db.Friends.Where(x => x.User1 == userId && x.Active == true).ToArray().Select(x => x.User2).ToList();
List<int> friendIds2 = db.Friends.Where(x => x.User2 == userId && x.Active == true).ToArray().Select(x => x.User1).ToList();
List<int> allFriendsIds = friendIds1.Concat(friendIds2).ToList();
// Get final set of ids
List<int> resultList = onlineIds.Where((i) => allFriendsIds.Contains(i)).ToList();
// Create a dict of friend ids and usernames
Dictionary<int, string> dictFriends = new Dictionary<int, string>();
foreach (var id in resultList)
{
var users = db.Users.Find(id);
string friend = users.Username;
string ProfilePic = users.ProfilePic;
if (!dictFriends.ContainsKey(id))
{
dictFriends.Add(id, friend);
}
}
var transformed = from key in dictFriends.Keys
select new { id = key, friend = dictFriends[key], ProfilePic = "VALUE HERE" };
string json = JsonConvert.SerializeObject(transformed);
// Set Clients
var clients = Clients.Caller;
// Call js function
clients.getonlinefriends(Context.User.Identity.Name, json);
// Return
return base.OnConnected();
}
答案 0 :(得分:1)
您遇到的问题是您没有将所有数据库信息记录到同一个对象中。您试图将过多信息放入单个键值配对字典中。相反,您应该创建一个帮助程序类,以更好地表示您返回给客户端的模型。例如:
public class UserJson
{
public string Name {get; set;}
public int Id {get; set;}
public string ProfilePic {get; set;}
}
然后在你查询数据库的循环中,然后创建这些对象,然后JsonConvert
:
var userList = new List<UserJson>();
foreach (var id in resultList)
{
var users = db.Users.Find(id);
string friend = users.Username;
string profilePic = users.ProfilePic;
userList.Add(new UserJson {Name = friend, Id = id, ProfilePic = profilePic });
}
string json = JsonConvert(userList);
或者,如果确实不想创建帮助程序类,则可以使用List<dynamic>
个匿名对象。但是使用帮助程序类有助于更好地封装代码(例如验证代码)。
答案 1 :(得分:0)
您可以使用元组而不是字典。
来自msdn的: Tuples
// Create a 7-tuple.
var population = new Tuple<string, int, int, int, int, int, int>(
"New York", 7891957, 7781984,
7894862, 7071639, 7322564, 8008278);
// Display the first and last elements.
Console.WriteLine("Population of {0} in 2000: {1:N0}",
population.Item1, population.Item7);
// The example displays the following output:
// Population of New York in 2000: 8,008,278
在你的情况下它将是
List<Tuple<int, string, string>>
您还可以创建一个类来保存结果。