2008-09-23 97 views
3

什麼是用於存在於SQL中的LINQ和類型表的最佳設計模式。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實體。

這工作得很好,但讓我疑惑:

一)我怎麼能做出這種更有效 b)爲何沒有微軟似乎提供任何創建強類型的類型表 c)是我的數據庫設計一個好的? d)其他人都在做什麼!

謝謝!

回答

3

Linq to SQL允許您將數據庫中的字符串或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描述了這是如何工作的。

+0

正是我所希望的! – 2010-10-13 18:57:17