类似于.NET中的“稀疏字段集”

时间:2019-05-28 23:39:52

标签: asp.net asp.net-mvc asp.net-core

我正试图找到描述我想要的词汇以及它是否存在的词汇。

我有一个表,其中显示了来自大型对象的一些数据点。仅为表加载整个对象非常慢。有没有一种方法可以只传递我想要的几个属性而不必定义新对象?

我在JSON API中发现了一个称为“稀疏字段集”的东西,我想知道在.NET中是否存在这样的其他名称。

更新: 与另一位编码员交谈,我意识到在后端和数据库之间实现这样的事情并对该表进行特定调用可能更有意义。如果需要创建一个新的对象来支持这一点,我仍然需要解决。我认为,如果我只保留相同的对象,但将所有不需要该表的连接对象都作空,那将会更快。但这也许被认为是不好的做法?同样,我们使用实体框架来实现其价值。

更新2: 我刚刚创建了一个没有所有.Include()的新查询,并且可以很好地满足我的需求:

_dataContext.ApplePie
.Include(f => f.Apples).ThenInclude(f => f.Apple)
        .Include(f => f.Sugars).ThenInclude(f => f.MolecularStructure)
        .Include(f => f.Recipe)

2 个答案:

答案 0 :(得分:2)

也许您正在寻找Anonymous Types

例如,如果您有一个带有三个属性的类型化对象,但只想对两个对象进行操作:

var threePropThing = new ThreePropertyThing { Id = 1, Message = "test", ExtraProperty = "ex" };

var myAnonThing = new { Id = threePropThing.Id, Message = threePropThing.Message };  

最佳做法是不传递此匿名对象。但是,如果确实需要,可以将其返回为object类型。

通常,当在c#中传递数据时,您希望将其键入。

答案 1 :(得分:1)

C#是一种强类型语言,我想说当对象定义(属性)事先未知时(例如在JSON API“字段”参数情况下),C#就不支持这种情况。实现这一点将意味着使用反射来过滤属性,这通常很慢并且容易出错。

实施C#Web服务时,人们通常会为每个请求创建一个DTO响应模型。

如果您的表具有固定的字段集,我个人建议创建一个仅包含表所需字段的DTO类,然后创建一个方法来返回特定请求的此响应。尽管它与问题中的“无需定义新对象”不符,但它使意图清晰明了,使将来维护API更加容易。

如果您有很多这样的方法,则可能要使用AutoMapper之类的库来节省时间,并避免将值从数据模型复制到DTO的重复代码。