2016-12-08 9 views
0

私は、SQL Server、Dapper.netを使用しているASP.NET MVC 5サイトを持っています。それはこれらのモデルを持っています。タイプテーブルの値に基づいてコレクションの選択を簡単に読み取る

私は、リストクラスを持っている:

public int Id { get; set; } 
public short ListingTypeId { get; set; } 
public DateTime DateStart { get; set; } 
public DateTime DateEnd { get; set; } 
public string Details { get; set; } 

とListingTypeクラス:

public short Id { get; set; } 
public string ListingTypeName { get; set; } 

あり20物件の種類がある - と、この数は、時間の経過とともに変化することがあります。

「映画」のリストタイプを追加したとします。私は、ListTypeName = "Movie"ですべてのリストを取得したいと思います。読みやすいコードで、新しいメソッドだけを必要としません。

我々は作品のために= 21 ListingTypeイドを想定した場合 - 基本的に私はこのようなSQLを実行しようとしている:

Select * From Listing Where ListingTypeID = 21 

はしかし、それは非常にunsemanticある - 私たちはSelectMovies方法でこれをラップする場合でも、リポジトリ - "21"は意味がありません。

LINQを使って映画を釣り上げるのに、リストテーブルのすべての行を選択することができますが、テーブルが非常に大きく、パフォーマンスが悪いことがあります。

私は、データベース内のListingType IDにまで同期さ列挙型を使用することができます - これは読むために非常に簡単だろう - 例えば:

var MovieListings = myRepo.Select(myEnum.Movie); 

しかし、一般的には、それが変更リストのものを使用するのは良い考えではありませんアイテムが同期しなくなり、データベース内のデータが重複してしまいます。私はそれをしたくありません。

ベストプラクティスを使用して列挙型またはハードコーディングデータベースID &を使用せずに、コードを読みやすくする意味で簡単に作成できますか?

+0

Wndrrの答えで問題が解決しないのですか? – GGO

答えて

0

はい、可能です。 ここでやるべきことは、データベースのListingTypeName列に一意制約を追加することです。ListingTypeの名前は複製できません。たぶんパフォーマンスをあまりにも傷つけないならば、数字のIdをテキストIDで置き換えることもできます(20レコードしかないのであれば大丈夫です)。

あなたの質問にはリポジトリについて言及していますが、私はそれらがかなり良いことだと思います。実際、彼らはあなたのケースで完璧な仕事をすることさえできました!単にFindListingByTypeName(string name)となるメソッドをリポジトリに追加するだけで、内部的にその名前を使用してListingTypeを探し、そのIDを使用してリストを取得します。

ところで、Select * From Listing Where ListingTypeID = 21のようなものをハードコードする必要がある場合は、大きな設計上の問題があります。これは、TypeNamesを表示し、次にタイプIDにマップするユーザーインターフェイスから来る必要があります。

+0

私の例では '21'は変数になります - 文字通りそこにハードコードされた値はありません。文字列であるデータベースのユニークな制約は良い習慣ではないので、私はこの理想を見つけることはできません。リストの型はほとんど決して(決して決して)変更されないので、Enumを使用してしまいました。もしそうしたとしても、他の場所でコードを変更する必要があるので、私はそれをOKとみなしました。とにかくありがとう。 – niico

関連する問題