2011-03-30 4 views
1

LinqがSQL Serverに対してクエリを実行した後、オブジェクトのプロパティがいつ設定されますか?LINQ式が評価された後にプロパティの値が設定されるのはいつですか?

次のExamVersionクラスのプロパティは、LINQ to SQLクラス(.dbml)ファイルによって生成されました。

[Column(Storage="_SourceSafeVersionNum", DbType="Int", UpdateCheck=UpdateCheck.Never)] 
public System.Nullable<int> SourceSafeVersionNum 
{ 
    get 
    { 
     return this._SourceSafeVersionNum; 
    } 
    set 
    { 
     if ((this._SourceSafeVersionNum != value)) 
     { 
      this.OnSourceSafeVersionNumChanging(value); 
      this.SendPropertyChanging(); 
      this._SourceSafeVersionNum = value; 
      this.SendPropertyChanged("SourceSafeVersionNum"); 
      this.OnSourceSafeVersionNumChanged(); 
     } 
    } 
} 

私はこのLINQクエリを実行した後:

var query = from examVersion in db.ExamVersions 
    where examVersion.ExamVersionID == ExamVersionID 
    select examVersion; 

return query.ToList(); 

とき/ LINQはSourceSafeVersionNumプロパティを設定しないどこ?

私は設定ツールにブレークポイントを設定しましたが、デバッグ中は呼び出されません。この値を設定するコンストラクタはありません。 SourceSafeVersionNumを想定し

答えて

2

Linq to sqlクラスはコアオブジェクトから継承しています。また、EFまたはlinqを使用している場合は、sqlがプロキシクラスを使用して入力します。

プライベートプロパティ "_SourceSafeVersionNum"を変更しようとしましたが、getとsetがプライベートの基になる変数をブレークポイントしましたか?パブリックセッターは、アプリケーションが変数を設定して変更を追跡できるようにするためのものです。 DBからデータを取り込むときにこれらを使用すると、ロード時にすべてのプロパティがOnPropertyChangedを起動します。

+0

_SourceSafeVersionNumをプロパティに変更しましたが、テストバッキングフィールドにアクセスすると実際に破損します。 _SourceSafeVersionNumはプロパティではなくバッキングフィールドであると私は思った。なぜそれが財産である場合ゲッターとセッターがないのですか? – Jason

+0

これはインスタンス固有のプライベートプロパティです。 getterとsetterは、実際にはそれらのプライベートプロパティのエントリ/リターンポイントを提供します。今日、これは私たちから隠されていて、私たちがpublic intを書くときMyProperty {get;セット; } .NETは私たちのプライベートプロパティを実際に管理します。 getとsetを追加すると、値が格納される個別のプライベートインスタンスプロパティが作成されます。つまり、_SourceSafeVersionNumはメモリ内のクラスの存続期間中実際に情報が存在する場所です。 – Gats

+0

.NETでこれらのプライベートプロパティを管理する方法についての説明がありますか?私はそれらについてもっと知りたいし、それらがオブジェクト構築にどのように使われているのか知りたいです。 – Jason

1

は、クエリの結果が評価されたときに、それを設定する必要がありますExamVersionsの財産であり、ここで起こっているマテリアライズド:

return query.ToList(); 

もちろん空のリストでクエリの結果は、プロパティができないならばそれを設定するオブジェクトがないので、設定します。

関連する問題