2009-04-01 5 views
9

結果セットをオブジェクトにバインドするときに、特定のプロパティまたはすべての読み取り専用プロパティを無視するようにLINQデータコンテキストに指示するにはどうすればよいですか?DataContext.ExecuteQueryを使用するときに読み取り専用クラスのプロパティを無視する<T>

LINQを使用して表現するのが難しいT-SQLステートメントを使用しているため、データコンテキストのExecuteQueryメソッドを使用して、T-SQLをデータベースに渡しています。

私のクラスTに読み取り専用のプロパティがある場合、データコンテキストがこれらのプロパティを設定しようとすると例外が発生し、setterプロパティがないために例外が発生します。これらのプロパティを無視するようにコンテキストに指示するにはどうすればよいですか?

これは私が今やっていることです。それは動作しますが、それは吸う:

public bool IsPaidInFull { 
    get { return NetTotal <= 0m; } 
    set { /* needed so linq doesn't choke. Should never be set by hand */ } 
} 
+0

私が最初に提案してもよい - 「do not _do_ that」? –

+1

何もしないでください。回避策は罪であり、受け入れられないので、私のここに投稿してください。 「結果セットにバインドするときに特定のプロパティをスキップする方法が見つからない」場合は、説明してください。 –

答えて

0

あなたはエンティティにLinqを考えましたか?あなたがどれほど遠くにいるか、あなたがどれくらいのオーバーヘッドを感じているかに応じて、プロジェクトを変換するのは面倒なことではないかもしれません。しかし、この厳密なシナリオは、Linqのエンティティへの問題ではありません。明示的にマップされていないため、ロード時にオブジェクトの読み取り専用プロパティーを更新しようとしません。これらは単に拡張プロパティーです。

また、プロパティの代わりにゲッター関数を使ってold-school/javaルートに行くこともできます。 public bool getIsPaidInFull(){返品NetTotal < = 0m;}

または、継承された子クラスの読み込み専用プロパティを実装することで対処できますが、あらゆる種類の型の問題が発生する可能性があります。

+0

これは、残念ながら、このプロジェクトのための可能な解決策ではありませんが、チップのおかげで。私は将来、完全なORMを検討するかもしれないと思う。 L2Sはデータモデル上の単純なラッパーとしては優れていますが、エンティティへのマッピングレイヤーとして使用するのは苦しいことがあります。 私は答えとして「古い学校」の提案を受け入れています。私はより良い解決策を見つけることができないようで、現在の回避策よりもgetterメソッドが優れています。 –

1
public bool IsPaidInFull 
{ 
    get { return NetTotal <= 0m; } 
    private set { ;} 
} 
+0

これは悪です... –

+0

datacontextで使用されているリフレクションと何か関係があります。 datacontextはリフレクションを使ってプロパティにgetterとsetterがあるかどうかを調べるが、アクセス修飾子はチェックしていないと思う。そして、実際にセッターを使用することはないので、アクセスに問題はありません。 – AndyClaw

関連する問題