3

SQL に存在する LINQ および型テーブルに使用する最適な設計パターンは何ですか。

値を型の値に制約する SQL のテーブルがあり、C# コードでこれを厳密に型指定された値として使用できるようにしたいと考えています。

「PackageStatus」タイプに対する私の現在のアプローチは次のとおりです。

SQL テーブル

PackageStatusType (int)
desc (varchar)

C# クラス - LINQ の使用

public class PackageStatusType
{
    static PackageStatusType()
    {

        var lookup = (from p in DataProvider.ShipperDB.PackageStatus
                      select p).ToDictionary(p => p.Desc);


        Unknown = lookup["Unknown"];
        LabelGenerated = lookup["Label generated"];
        ReadyForCollection = lookup["Ready for pickup"];
        PickedUp = lookup["Picked up"];
        InTransit = lookup["In Transit"];
        DeliveryAttempted = lookup["Delivery attempted"];
        DeliveredByHand = lookup["By hand"];
        DeliveryFailed = lookup["Delivery failed"];
        Delivered = lookup["Delivered"];
        Voided = lookup["Voided"];
    }

    public static ShipperDB.Model.PackageStatus Unknown;
    public static ShipperDB.Model.PackageStatus LabelGenerated;
    public static ShipperDB.Model.PackageStatus ReadyForCollection;
    public static ShipperDB.Model.PackageStatus PickedUp;
    public static ShipperDB.Model.PackageStatus InTransit;
    public static ShipperDB.Model.PackageStatus DeliveryAttempted;
    public static ShipperDB.Model.PackageStatus DeliveryFailed;
    public static ShipperDB.Model.PackageStatus Delivered;
    public static ShipperDB.Model.PackageStatus DeliveredByHand;
    public static ShipperDB.Model.PackageStatus Voided;
}

その後PackageStatusType.Delivered、C# コードを挿入すると、適切な LINQ エンティティが正しく参照されます。

これはうまくいきますが、私は疑問に思います:

a) どうすればこれをより効率的にすることができますか b) マイクロソフトは、厳密に型指定された型のテーブルを作成するためのものを提供していないようです c) 私のデータベース設計は良いものですか? d) 他のみんなは何をしているの?

ありがとう!

4

1 に答える 1

3

Linq to SQL を使用すると、データベースの string または int 列を C# コードの列挙型にマップできます。これにより、データベースから選択するときに、Linq to SQL がこれらの値をマップできるようになります。この場合、パッケージ ステータス列を、列挙の値を含む int 列、または列挙の値を表す文字列に変更します。

あなたの場合、指定したさまざまな値を持つ PackageStatus 列挙を作成し、ORM デザイナーまたは SQLMetal を使用して、その列をその列挙にマップします。唯一の注意点は、Linq to SQL が Enum.Parse() を使用してデータベースの文字列値を列挙にマップするか、int 値がデータベース内の値が列挙の値と一致します。

コード内でルックアップ テーブルをまったくマップする必要がないため、これはより効率的です。

http://msdn.microsoft.com/en-us/library/bb386947.aspx#EnumMapping では、これがどのように機能するかについて説明しています。

于 2008-09-23T01:02:18.960 に答える