Return 复杂 JSON(对象包含集合)在 C# 中使用 WCF LINQ-TO-SQL 和 REST ASP.NET
Return Complex JSON(object contains set) Using WCF LINQ-TO-SQL AND REST IN C# ASP.NET
在我的 Web 应用程序中,当用户登录时我有一个登录页面我需要 return 到 Web 应用程序对象帐户,其中包含播放器的实体集:
public Account Login(string email,string password)
{
var query = (from p in db.Accounts
where (p.EMAIL.Equals(email) && p.PASSWORD.Equals(password))
select new { EMAIL=p.EMAIL,PASSWORD=p.PASSWORD,NAME=p.NAME,Players=p.Players }).FirstOrDefault();
return new Account { EMAIL = query.EMAIL, PASSWORD = query.PASSWORD, NAME = query.NAME,Players=query.Players};
}
Players 是 EntitySet 的类型
我的界面:
[OperationContract]
[WebGet(UriTemplate = "/Login/{email}/{password}", ResponseFormat = WebMessageFormat.Json)]
Account Login(string email,string password);
如果帐户没有玩家,获取操作有效,我可以看到 json returned。
{"EMAIL":"#####@gmail.com ","NAME":"Test","PASSWORD":"#####","Players":[]}
如果账户有玩家,浏览器就会挂起,没有任何反应。
我明白这与 players 是一个 EntitySet 这一事实有关,但是如何实现呢?
所以我找到的解决方案是分别查询帐户和他的玩家 EntitiySet 我认为主要问题是由于 LINQ-TI-SQL 和 REST,玩家是服务内部的 EntitiySet 类型不知道怎么处理。
[OperationContract]
[WebGet(UriTemplate = "/Login/{email}/{password}", ResponseFormat = WebMessageFormat.Json)]
Account Login(string email,string password);
[OperationContract]
[WebGet(UriTemplate = "/GetPlayers/{email}", ResponseFormat = WebMessageFormat.Json)]
Player[] GetPlayers(string email);
public Account Login(string email, string password)
{
var query = (from p in db.Accounts
where (p.EMAIL.Equals(email) && p.PASSWORD.Equals(password))
select new { EMAIL = p.EMAIL, PASSWORD = p.PASSWORD, NAME = p.NAME, Players = p.Players }).FirstOrDefault();
return new Account { EMAIL = query.EMAIL, PASSWORD = query.PASSWORD, NAME = query.NAME};
}
public Player[] GetPlayers(string email)
{
var query = (from p in db.Accounts
where (p.EMAIL.Equals(email))
select p).FirstOrDefault();
Player[] players = new Player[query.Players.Count];
for(int i=0; i< players.Length; i++)
{
players[i] = new Player {FirstName = query.Players[i].FirstName,LastName=query.Players[i].LastName };
}
return players;
}
我在 GetPlayers 上尝试过 query.Players.toArray() 也不起作用。
在我的 Web 应用程序中,当用户登录时我有一个登录页面我需要 return 到 Web 应用程序对象帐户,其中包含播放器的实体集:
public Account Login(string email,string password)
{
var query = (from p in db.Accounts
where (p.EMAIL.Equals(email) && p.PASSWORD.Equals(password))
select new { EMAIL=p.EMAIL,PASSWORD=p.PASSWORD,NAME=p.NAME,Players=p.Players }).FirstOrDefault();
return new Account { EMAIL = query.EMAIL, PASSWORD = query.PASSWORD, NAME = query.NAME,Players=query.Players};
}
Players 是 EntitySet 的类型
我的界面:
[OperationContract]
[WebGet(UriTemplate = "/Login/{email}/{password}", ResponseFormat = WebMessageFormat.Json)]
Account Login(string email,string password);
如果帐户没有玩家,获取操作有效,我可以看到 json returned。
{"EMAIL":"#####@gmail.com ","NAME":"Test","PASSWORD":"#####","Players":[]}
如果账户有玩家,浏览器就会挂起,没有任何反应。
我明白这与 players 是一个 EntitySet 这一事实有关,但是如何实现呢?
所以我找到的解决方案是分别查询帐户和他的玩家 EntitiySet 我认为主要问题是由于 LINQ-TI-SQL 和 REST,玩家是服务内部的 EntitiySet 类型不知道怎么处理。
[OperationContract]
[WebGet(UriTemplate = "/Login/{email}/{password}", ResponseFormat = WebMessageFormat.Json)]
Account Login(string email,string password);
[OperationContract]
[WebGet(UriTemplate = "/GetPlayers/{email}", ResponseFormat = WebMessageFormat.Json)]
Player[] GetPlayers(string email);
public Account Login(string email, string password)
{
var query = (from p in db.Accounts
where (p.EMAIL.Equals(email) && p.PASSWORD.Equals(password))
select new { EMAIL = p.EMAIL, PASSWORD = p.PASSWORD, NAME = p.NAME, Players = p.Players }).FirstOrDefault();
return new Account { EMAIL = query.EMAIL, PASSWORD = query.PASSWORD, NAME = query.NAME};
}
public Player[] GetPlayers(string email)
{
var query = (from p in db.Accounts
where (p.EMAIL.Equals(email))
select p).FirstOrDefault();
Player[] players = new Player[query.Players.Count];
for(int i=0; i< players.Length; i++)
{
players[i] = new Player {FirstName = query.Players[i].FirstName,LastName=query.Players[i].LastName };
}
return players;
}
我在 GetPlayers 上尝试过 query.Players.toArray() 也不起作用。