【问题标题】:LINQ: select certain object properties Into Same objectLINQ:选择某些对象属性到同一对象中
【发布时间】:2016-07-01 23:29:14
【问题描述】:

如果我有一个具有许多属性的对象 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 信息的开销,尽管我没有传输其所有属性的数据。

亚历克斯

【问题讨论】:

  • 谢谢大家的回答。

标签: c# performance linq


【解决方案1】:

实际上,我认为性能不会有太大提高,因为 Select 语句将遍历您的所有列表并为您创建一个新的对象列表。但是,如果您有不使用的参考属性。你可以保存在那里。

如果在向 UI 显示数据时没有复杂的逻辑。乳清你不保持模型原样。

【讨论】:

  • 有些对象有引用属性,有些则没有,但它们可能有一个大的字符串属性,我不需要在我的 datagridview 中显示。
【解决方案2】:

如果这仅用于 UI 显示 - 没有性能提升。无论您可能获得多少时间,都会因为创建一个新的匿名类型列表而失去。

但是,如果您打算通过网络发送此对象(例如作为对请求的响应),那么这是有道理的。这样,需要序列化和通过网络发送的属性就更少了。

但是,在大多数情况下,您应该担心这种级别的性能。用户不会注意到这种级别的改进。如果您真的希望提高应用程序的性能,您应该对其进行分析并找到热点。

【讨论】:

  • 是的,我想我应该开始使用一些我还没有做过的分析,这会给我一个真正的答案。
【解决方案3】:

假设您的构造函数“便宜”,唯一有意义的性能提升是在 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

【讨论】:

  • 我想这个问题源于我对从后端分离 UI 的无知。如果我的实体是在我的后端定义的,并且我需要在我的 UI 中显示一种“dto”对象,那么这些 dto 应该在哪里定义(类似于你的答案的 IMyModel ???)?我认为我的 UI 和后端都应该知道它们,所以我是否必须在两者之间的第三层中定义它们?
  • 如果我们假设您有一个用于所有 UI 代码的程序集,一个包含您的数据访问和实体的单独程序集,那么 IMyModel 和它的任何实现都可以驻留在 UI 程序集中(或仅由UI 程序集)。在某个地方,您需要从数据对象映射到 UI 对象,而无论发生这种情况,您的代码都需要了解这两者。
猜你喜欢
  • 2010-10-29
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
相关资源
最近更新 更多