【问题标题】:Return Complex JSON(object contains set) Using WCF LINQ-TO-SQL AND REST IN C# ASP.NET在 C# ASP.NET 中使用 WCF LINQ-TO-SQL 和 REST 返回复杂 JSON(对象包含集)
【发布时间】:2016-10-23 20:24:22
【问题描述】:

在我的网络应用程序中,当用户登录时,我有一个登录页面,我需要将包含播放器实体集的对象帐户返回到网络应用程序:

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

如果 Account 没有玩家,则 get 操作有效,我可以看到返回的 json。

{"EMAIL":"#####@gmail.com ","NAME":"Test","PASSWORD":"#####","Players":[]}

如果 Account 有播放器,浏览器就会挂掉,没有任何工作。

我知道这与 player 是 EntitySet 的事实有关,但是如何实现呢?

【问题讨论】:

  • 尝试在 p.Players 上调用 ToList()。您可能还需要进行选择。
  • 您好,尝试一下,但我无法使用 List 创建帐户,因为 List != EntitiySet,REST 应该知道如何在幕后执行此操作。
  • 好的...尝试从 p.Players 中选择特定字段,例如 p.Players.Select(p => new { p.Name, p.Whatever, p.Etc });我打赌序列化程序在循环属性或其他方面有困难。我在实体框架 4 中遇到了类似的问题。
  • 谢谢,不幸的是我应该返回帐户,任何更改都不会让我做演员。

标签: asp.net json wcf rest linq-to-sql


【解决方案1】:

所以我找到的解决方案是分别查询帐户和他的玩家 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() 也不起作用。

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 2011-07-09
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多