易于根据类型表值选择集合选择

时间:2016-12-08 23:30:20

标签: c# asp.net-mvc asp.net-mvc-5

我有一个使用SQL Server,Dapper.net的ASP.NET MVC 5站点。它有这些模型。

我有一个Listing类:

public int Id { get; set; }
public short ListingTypeId { get; set; }
public DateTime DateStart { get; set; }
public DateTime DateEnd { get; set; }
public string Details { get; set; }

和一个ListingType类:

public short Id { get; set; }
public string ListingTypeName { get; set; }

有20种商品类型 - 这个数字可能会随着时间而变化。

我们假设我们添加了一部电影"上市类型。我想说,所有列表都包含了ListTypeName =" Movie" - 在易于阅读的代码中,并不仅仅需要一种新的方法。

如果我们假设电影的ListingType Id = 21 - 基本上我试图像这样执行SQL:

Select * From Listing Where ListingTypeID = 21

然而,这是非常无意义的 - 即使我们将它包装在存储库中的SelectMovies方法中 - " 21"是没有意义的。

我可以选择列表中的每一行 - 并使用LINQ来删除电影 - 但是,表格可能非常大,而且这不会有效。

我可以使用Enums同步到数据库中的ListingType ID - 这将非常容易阅读 - 例如:

var MovieListings = myRepo.Select(myEnum.Movie);

但一般来说,将这些项目用于可变项目列表并不是一个好主意,因为它们会在数据库中失去同步和重复数据。我不想这样做。

是否有可能以具有语义易读代码的方式创建它,而无需使用枚举或硬编码数据库ID&使用最佳实践?

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。 我认为你应该在数据库中的ListingTypeName列添加唯一性约束,因此ListingType的名称不能重复。甚至可能用文本ID替换数字Id,如果它不会对表现造成太大的伤害(如果你只有20条记录就应该很好)。

在你的问题中你提到了存储库,我认为它们是一件非常好的事情。事实上,他们甚至可以在你的情况下做得很完美!只需将一个方法添加到存储库即FindListingByTypeName(string name),它将在内部使用其名称查找ListingType,然后使用其ID来检索列表。

顺便说一句,如果你必须对Select * From Listing Where ListingTypeID = 21这样的东西进行硬编码,你会遇到很大的设计问题。这应该来自您要向其显示TypeNames的用户界面,然后映射到Type id。