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描述了它是如何工作的。