LINQ +类型表最佳实践

时间:2008-09-23 00:52:54

标签: linq-to-sql

什么是用于LINQ的最佳设计模式和SQL中存在的类型表。

我在SQL中有表格将值限制为类型值,我希望能够在我的C#代码中使用它作为强类型值。

我对'PackageStatus'类型的当前方法如下:

SQL表

  

PackageStatusType (int)
  desc (varchar)

C#Class - 使用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)为什么Microsoft似乎没有提供任何东西来创建强类型类型表 c)我的数据库设计是不是很好? d)其他人在做什么!

谢谢!

1 个答案:

答案 0 :(得分: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描述了这是如何运作的。