LINQ +类型表最佳实践

时间:2020-03-06 14:34:28  来源:igfitidea点击:

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

我在SQL中有一些表可以将值约束为类型值,我希望能够在Ccode中将其用作强类型值。

我目前针对" PackageStatus"类型的方法如下:

SQL表

PackageStatusType (int)

  desc (varchar)

使用LINQ的CClass

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"放入我的Ccode中,它将正确地引用正确的LINQ实体。

这工作正常,但让我感到奇怪:

a)我该如何提高效率
b)微软为什么似乎不提供任何创建强类型表的方法
c)我的数据库设计是否还不错?
d)其他人在做什么!

谢谢!

解决方案

Linq to SQL允许我们将数据库中的字符串或者int列映射到Ccode中的枚举。当我们从数据库中选择时,这使我们可以让Linq to SQL为我们映射这些值。在这种情况下,我会将包状态列更改为具有枚举值的int列或者表示枚举值的字符串。

在情况下,我将使用具有我们指定的不同值的PackageStatus枚举,然后使用ORM设计器或者SQLMetal将该列映射到该枚举。唯一的警告是数据库中列的字符串值必须与枚举中的值匹配,因为Linq to SQL将使用Enum.Parse()将字符串值从数据库映射到枚举或者确保int值数据库中的值与枚举中的值匹配。

因为我们甚至根本不需要在代码中映射查找表,所以这样做效率更高。

http://msdn.microsoft.com/zh-cn/library/bb386947.aspx#EnumMapping描述了它是如何工作的。