2016-07-01 2 views
1

多くのプロパティを持つオブジェクトAがある場合、そのうちの2つだけが必要ですが、不要なデータを転送しない、つまり必要なオブジェクトプロパティを選択してパフォーマンスを向上させることができます名前付きまたは匿名の新しいタイプB。LINQ:特定のオブジェクトのプロパティを同じオブジェクトに選択

ここで、元のオブジェクトAのリストを、たとえば私が必要とする2つのプロパティのみを表示する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(); 

に選択することができる場合、私は、思っていました。問題は、パフォーマンスで何かを得るか、元の大きなオブジェクトの情報のオーバーヘッドがまだあることです。ただし、すべてのプロパティのデータを転送するわけではありません。

アレックス

+0

ありがとうございました。 –

答えて

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 
+0

この質問は、私のバックエンドからUIを切り離すことについての私の無知から生じていると思います。私のエンティティが私のバックエンドで定義されていて、私のUIにある種の "dto"オブジェクトを表示する必要がある場合、それらの定義はどこですか(答えのIMyModelのようなもの???)?私は、私のUIとバックエンドの両方でそれらについて知っておく必要があるので、2つの間の第3層にそれらを定義する必要がありますか? –

+0

すべてのUIコードに対して1つのアセンブリがあると仮定すると、データアクセスとエンティティを含む別のアセンブリがある場合、IMyModelなどはUIアセンブリ(またはUIアセンブリのみで参照されるアセンブリ)に存在できます。どこかで、データオブジェクトからUIオブジェクトにマップする必要があります。その場合、コードが両方のことについて知る必要がある場所であればどこでもかまいません。 –

3

Selectステートメントは、すべてのあなたのリストを通過し、あなたのためのオブジェクトの新しいリストを作成するよう実は、私が思うに、パフォーマンスがあまり向上させることはできません。しかし、あなたが参照プロパティを使用していない場合。そこに保存することができます。

UIにデータを表示するときに複雑なロジックがない場合。ホエイはモデルをそのまま保つわけではありません。

+0

一部のオブジェクトには参照プロパティがありますが、そうでないものもありますが、データグリッドビューに表示する必要のない大きな文字列プロパティを持つことがあります。 –

2

これはUI表示のみの場合です。パフォーマンスの向上はありません。あなたが得るかもしれない時間は、匿名のタイプの新しいリストを作成することによって失われます。

しかし、このオブジェクトをネットワーク経由で(たとえば要求への応答として)送信する場合は、これが理にかなっています。この方法では、少ない数のプロパティをシリアル化してネットワーク経由で送信する必要があります。

しかし、ほとんどの場合、このレベルのパフォーマンスで心配する必要があります。ユーザーはそのようなレベルの改善を気付かないでしょう。アプリケーションのパフォーマンスを本当に向上させたい場合は、プロファイルを作成してホットスポットを見つける必要があります。

+0

はい、私は実際に答えを与えるだろう、私はまだ行っていないいくつかのプロファイリングを使用して開始する必要があります。 –

関連する問題