返回EF对象作为c#中的普通数组

本文关键字:数组 EF 对象 返回 | 更新日期: 2023-09-27 17:54:38

用数据填充EF对象(例如users)并从WebAPI返回它后,我以json格式获得它,如下所示:

[
    {"username":"lakshman553","email":"abc@xyz.com","phone":1234567},
    {"username":"lakshman323","email":"pqr@xyz.com","phone":"122267"},
]

由于我使用webapi完全是为了内部目的,我更希望数据如下:

[
     ["lakshman553","abc@xyz.com",1234567], 
     ["lakshman323","pqr@xyz.com",1222267]
]

当数据量很大时(通常是这种情况),这样做可以大大减少有效负载。

如何在c#中实现这一点。迭代通过users对象并将其分配给行和列计数的大小数组是我知道的一种方法,但是有一个直接的方法来做到这一点吗?

谢谢。

返回EF对象作为c#中的普通数组

您可以使用以下LINQ扩展方法实现此转换:

// Project each list item into an array of item property values
var array4all = list.Select
(
    item => item.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
                          .Select(property => property.GetValue(item))
                          .ToArray()
).ToArray();

顺便说一句,我很关心这句话:

因为我使用webapi完全是为了内部目的[…]

我相信你是在试图简化问题而制造新问题。在编码、可读性和可维护性方面,我发现你让事情变得更困难了。

也许像混淆属性名称a, b, c ....您可以使用AutoMapperdynamic DTO映射到具有完整属性名称的实际模型/DTO。比如:

{ "a": "hello world", "b": 20 } => { "text": "hello world", "number": 20 }

或者你可以看看MsgPack, BSON…

如果您对服务器的响应进行gzip压缩(您应该这样做),那么这些重复的属性名称实际上并不重要。另一方面,将属性作为属性使得处理数据对于提供者和使用者来说都要容易得多。

您说您仅将其用于内部目的,但是当您使用该数据时,您仍然需要为此构建自定义解析机制。要做到这一点,你需要有一个一致的方式来做到这一点,所以你需要额外的契约来定义,例如属性的顺序,以及-当解析到c#时-它的类型等。

这只是为了减少带宽,这是很大的开销,正如我上面所说的,一旦你压缩了数据,这并不重要。

使用Json。净:

var users = new[] 
{
    new { username = "lakshman553", email = "abc@xyz.com", phone = "1234567" },
    new { username = "lakshman323", email = "pqr@xyz.com", phone = "122267" }
};
JsonConvert.SerializeObject(JArray.FromObject(users).Select(_ => _.Values())); 

:

[["lakshman553","abc@xyz.com","1234567"],["lakshman323","pqr@xyz.com","122267"]]