LINQ:选择某些对象属性进入同一对象

时间:2016-07-01 23:29:14

标签: c# performance linq

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

亚历

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

如果仅用于UI显示 - 则没有性能提升。无论你获得什么样的时间,你都会因为创建一个新的匿名类型列表而失败。

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

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

答案 2 :(得分:1)

唯一有意义的性能提升,假设你的构造函数是"便宜",就是从/到的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