2011-12-22 6 views
2

私のアプリでは、顧客に関するいくつかの情報を表示する必要があります(顧客にはコードと名前があります)。フィールドの一つは質問のLinqToSqlカスタム関数の実行コスト

DisplayName = Code + " - " + Name 

「表示名」である私は、ビューモデルに、データベースから顧客を取得し、このように、表示名を設定します。

from customer in this.Context.Customers 
select new CustomerViewModel 
     { 
      DisplayName = customer.Code + " - " + customer.Name 
     } 

しかし、私はこれを抽出したいと思います私は複数の場所でそれを使用し、論理が変更された場合(DisplayName = Nameなど)、式や関数に論理を追加すると、多くの変更を行う必要があります。それが正常に動作し、ロジックを再利用可能になりますが、問題は関数が解析できないということである

from customer in this.Context.Customers 
select new CustomerViewModel 
     { 
      DisplayName = CustomerDisplayName(customer) 
     } 

したがって、私はこの機能

Func<Customer, string> CustomerDisplayName = (c => c.Code + " - " + c.Name) 

と、このようにそれを使用するを作成しましたLinqToSqlは最初にデータ( 'Code'とName ')を取得し、各レコードの関数を実行します。

私はパフォーマンスについて心配する必要がありますか(データがたくさんある場合)、最初のオプションに固執する必要がありますか?それとも、関数を使うのはいいですか?

+0

fist文は良いクエリを生成しますか? 2番目のクエリは2つのクエリを生成しますか? – TheBoyan

+0

「多くのデータが意味するもの」とは何か:100万を超えるもの?あなたはN + 1クエリーを得ない限り、あなたが心配する必要はないと思うと思います。(あなたのSQLをプロファイルして確かめてください) – Pleun

+0

@Bojan:両方とも単一のクエリを生成します。私の意見はどちらも「良い」ですが、2番目のデータはサーバからデータを取得した後に余分な作業をしなければなりません – SzilardD

答えて

2

モデルでは、クラスCustomerクラスがあります(これはファイルのyourDataClasses.designer.csを参照)。

したがって、yourDataClases.csファイルを変更し、部分クラスCustomerを追加し、プロパティDisplayNameを追加する必要があります。

yourDataClases.csであなたのコードは次のようになります。

public partial class Customer 
{ 
    public int DisplayName 
    { 
     get 
     { 
     return this.Code + " - " + this.Name; 
     } 
    } 
} 

あなたのクエリはよく次のようになります。

var res = from c in this.Context.Customers select c; 
0

あなたはそのすべてのデータとコードと名前が、全体Customerエンティティだけでなく、取得しています。これは遅くなるでしょう。実際のデータ量(行数)に応じて、パフォーマンスの観点から関連性があるかもしれません。おそらく、1000行未満の場合はそうではありません。

より多くの列を取得すると、SQL Serverがカバリングインデックスを使用できなくなる可能性があります。したがって、この観点からは実際にはかなり遅くなる可能性があります。とにかくそのようなインデックスを持っていない場合、その違いは、それほど高価ではないネットワーク転送でのみです。