0

LINQ には次のような状況があります: オブジェクト (ブログの「投稿」) があり、さまざまな値を取ることができる「ステータス」フィールドがあり、これらすべての値をリストするテーブルがあります (このテーブルには Id と Desc しかありません)。 .
これで、両方のテーブル間のリレーションシップが作成されたので、モデルでは、Post.Status は int ではなく、「PostStatus」のインスタンスになります。

したがって、Post のステータスをたとえば 20 に設定したい場合、フィールドを 20 に設定するだけではなく、割り当てる PostStatus のインスタンスが必要です。これらのステータス値はすべてロジックでハードコーディングされているため、コードに「20」をハードコーディングしても問題ありません。
これを行うより良い方法はありますか?

switch (Action) {
 case "Ignore":
  post.PostStatus = (from s in db.PostStatus where s.Id == 90 select s).First();
  break;
 case "Assign":
  post.PostStatus = (from s in db.PostStatus where s.Id == 20 select s).First();
  break;
 case "MarkDone":
  post.PostStatus = (from s in db.PostStatus where s.Id == 30 select s).First();
  break;
 case "MarkPublished":
  post.PostStatus = (from s in db.PostStatus where s.Id == 40 select s).First();
  post.Public = true;
  break;
}

正直なところ、私はこのコードが嫌いです。まず第一に、PostStatus インスタンスを取得するために不必要に DB にクエリを実行するためですが、ほとんどの場合、非常に冗長であるためです。
これを行うより良い方法はありますか?

ありがとう!
ダニエル

4

1 に答える 1

1

PostStatus は多かれ少なかれ列挙型のようです。DB に関連するテーブルを作成することで、常にこのようなことを行っていますが (あなたが行っているように)、DBML の関係を削除し、子列の CLR 型を列挙型に変更します。列挙型は、親 DB テーブルの行と同じ値で宣言されます (この場合、Assign = 20、MarkDone = 30 など)。私は、すべての列挙型のコードからテーブルの値を埋めるツールを作成しました。そのように、コードは「マスター」です (誰かが値または既存の値の名前を変更しようとすると爆撃しますが、新しい値は「うまく機能します」 )。今、あなたがやっていることのようなことをしたいとき、必要なデータはすでに列挙型にあります- Post.PostStatus = Action を設定するだけです (Action を文字列から同じ列挙型に変更すると仮定します)- DB なしヒット必須。

また、もう少し動的なものもいくつかあります。アプリの起動時に DB から一度キャッシュし、Dictionary にドロップするため、DB にヒットすることなく ID を設定するだけです。何百万もの値について話しているのでなければ、非常に効率的です。

于 2009-11-14T19:30:14.263 に答える