如果我有一个对象A有许多属性,其中我只需要几个,我可以通过不传输不必要的数据来提高性能,即只选择我需要的对象属性到一个新的类型B中,无论是命名的还是匿名的。
现在假设我想将这些原始对象a的列表绑定到,比如说,datagridview,它只显示我想要的两个属性。我使用原始对象A的属性名创建了datagridview列,并将其数据源类型设置为typeof(A)。我想知道,如果我可以选择到相同的对象A只是省略我不需要的属性,即
public class MyObject
{
public string prop1 { get; set; }
public string prop2 { get; set; }
.....
public string propN { get; set; }
}
var list = context.MyObject
.Select(n => new MyObject { prop1 = n.prop1, prop2 = n.prop2 }).ToList();
通过这种方式,我不需要定义新的类型,无论是命名的还是匿名的。问题是,我是否在性能上获得了一些东西,或者我仍然有原始大对象A信息的开销,尽管我没有传输其所有属性的数据。
亚历克斯实际上,我认为性能不能提高太多,因为Select语句会遍历所有的列表并为您创建一个新的对象列表。但是如果你有不使用的引用属性。你可以保存在那里。
如果在UI显示数据时没有复杂的逻辑。你为什么不让这个模型保持原样呢?
如果这只是用于UI显示-没有性能增益。创建一个新的匿名类型列表所节省的时间将会白白浪费。
但是,如果您打算通过网络发送此对象(例如作为对请求的响应),那么这是有意义的。这样,需要序列化和通过网络发送的属性就更少了。
然而,在大多数情况下,您应该担心这种级别的性能。用户不会注意到这种级别的改进。如果您真的希望提高应用程序的性能,您应该对其进行分析并找到热点。唯一有意义的性能增益,假设您的构造函数是"廉价的",是在SQL和数据传输从/到。
也就是说,并非一切都与性能有关。有时是关于清晰度、可扩展性、解耦等。明确地说,你是在强迫别人问"这个属性是由UI使用的吗?"
除了清晰度问题之外,UI和后端实体之间还存在耦合问题。这并不理想。一个廉价/临时的解决方案可能是这样的。请记住,由于类上的接口,它仍然是耦合的,但是如果需要的话,将来调整它将是微不足道的。
public interface IMyModel
{
string prop1 { get; set; }
string prop2 { get; set; }
}
public class MyObject : IMyModel
{
public string prop1 { get; set; }
public string prop2 { get; set; }
.....
public string propN { get; set; }
}
IEnumerable<IMyModel> list = context.MyObject
.Select(n => new { n.prop1, n.prop2 }) // only select these properties
.ToArray() // execute the query
.Select(n => (IMyModel)new MyObject { prop1 = n.prop1, prop2 = n.prop2 }); // construct our desired object