【问题标题】:Returning fields from multiple entities from ASP.NET Web API v2从 ASP.NET Web API v2 返回多个实体的字段
【发布时间】:2014-06-03 01:45:19
【问题描述】:

我正在构建一个 ASP.NET Web API v2 项目,我在其中使用 Entity Framework v6 对数据库进行建模。到目前为止,只有当集合是一种对象类型时,我才能够返回对象集合。即<Customer><Order>

我想返回一个对象集合,但包含来自相关实体的字段(或属性)(存在关联)。我想我已经正确设置了 LINQ to Entity 查询,但我不确定如何将生成的匿名类型返回给调用 API 的 jQuery 方法。

[Route("api/clients/GetAllClientsWithPaymentMethod")]
[HttpGet]
public NOT-SURE-WHAT-RETURN-TYPE-SHOULD-BE GetAllClientsWithPaymentMethod()
{
  using (var context = new MyEntities())
  {
    context.Configuration.ProxyCreationEnabled = false;
    var query = from client in context.Clients
                select new
                {
                  ClientID = client.ID,
                  CompanyName = client.CompanyName,
                  Phone = client.Phone,
                  Email = client.email
                  PaymentMethod = client.payments.PaymentMethod
                };
    return query.ToList();
  }
}

匿名类型是返回此信息的正确方法吗?如果是这样,返回类型应该是什么?有一个更好的方法吗?

【问题讨论】:

    标签: entity-framework asp.net-web-api linq-to-entities anonymous-types


    【解决方案1】:

    我会创建一个名为 Client 的类,其中包含您想要返回的所有字段。

    例如

    public class Client
    {
        private int ID;
        private string companyName;
        private string phoneNumber;
        private string email;
        private string payMethod;
    
    
        public Client()
        {
        }
    
        //...etc
    

    }

    在控制器中,我将根据数据库查询的结果创建一组客户端对象,然后我将返回一个 IEnumerable 客户端,例如

    public IEnumerable<Client> GetAllClientsWithPaymentMethod()
    

    在客户端,您可以使用您正在使用的序列化程序读取消息的内容。

    HttpClient client = new HttpClient();
    HttpResponseMessage response = await client.GetAsync("api/clients/GetAllClientsWithPaymentMethod");
    
    IEnumerable<Client> returnedClients = response.Content.ReadAsAsync<Client>(new[] { JsonFormatter() }).Result;
    

    【讨论】:

    • 创建类与使用IEnumerable&lt;Object&gt; GetAllClientsWithPaymentMethod()返回对象集合相比是否有优势
    • 是的,class 可以做很多事情。在这种情况下,您似乎试图使用 jQuery 将信息从数据库传递到前端,以进行不知道“客户端”类的其余调用。我可能会使用this 并按照描述返回类对象并将您的 webapi 服务器设置为使用 json 序列化。
    • 像这样:HttpSelfHostConfiguration config = new HttpSelfHostConfiguration("127.0.0.1");JsonSerializerSettings settings = new JsonSerializerSettings() { PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All, TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All }; config.Formatters.Add(new JsonMediaTypeFormatter() { SerializerSettings = settings }); var host = new HttpSelfHostServer(config); host.OpenAsync().Wait();
    • 非常感谢您的帮助。你说得对,我的最终目标是通过 jQuery 将结果作为 JSON 集合返回。我仍然感到困惑,为什么最好设置一个新类来保存查询结果而不是返回Object 的集合。请不要将我的回复视为“刻薄”或“敌对”,而是我仍然感到困惑,因为在我看来,使用匿名类的意义会被创建一个新类所击败,只是为了保存将被序列化的结果到 JSON 集合。
    • 欢迎您的帮助!这里没有收到任何snark。该类将使组织对象中的字段变得更加容易。它还将允许 webAPI 框架在返回对象时正确序列化对象。如果服务器设置为在您返回 IEnumberable&lt;Client&gt; 时使用 JSON 序列化程序,它将使用正确的序列化程序将对象序列化为响应的内容。
    猜你喜欢
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2013-04-01
    • 2018-07-17
    • 2015-01-10
    相关资源
    最近更新 更多