我不得不为我的大学开发一个系统,其中包括对几乎所有数据(讲座、讲师、助教、学生等)的跟踪我的数据库大约有30个表,而且非常复杂。我使用EF和linq来解决连接到数据库和从中查询的问题。但我越深入,我的查询就越难写,更不用说维护了。以下是一个查询的示例:http://pastebin.com/Za1cYMPa
正如你所看到的,这里一片混乱。
那么,我是滥用了linq(linq可以解决这个问题,但方法不同),还是linq不适用于像这样更复杂的系统?
这是一个普遍的问题,而不是一个解决特定问题的问题。
如果用本机SQL编写,您认为该查询看起来更好还是更易于维护?在这种情况下,可以在存储过程中隐藏查询。一旦进入高级查询,它总是一团糟。您可以通过将子查询隐藏到数据库视图或EF查询视图中来降低一些复杂性。但是,如果您有高度规范化的OLTP数据库,并且需要进行复杂的报告/分析/数据挖掘查询,那么它总是很大,而且维护性很差。这就是OLAP系统存在的原因(我没有检查查询的内容,只是检查长度,所以不要把它作为构建OLAP多维数据集的原因)。
更重要的是查询的性能。。。
通常,可以通过将重复代码抽象为可重用、易于维护的组件来降低复杂性。
在您的特定情况下,可以通过实现存储库和规范模式来降低复杂性,使代码更加一致、更易于阅读和维护。
Huy Nhuyen有一系列非常有用的文章,解释了存储库模式、规范模式以及如何将它们与实体框架有效地结合起来以获得更好的代码。这些可在以下网址获得:
- 实体框架4 POCO、存储库和规范模式
- 实体框架4中的规范模式再修订
- 实体框架4 POCO,存储库和规范模式[升级到CTP5]
- 实体框架4 POCO、存储库和规范模式[升级到EF 4.1]
哦,这真是太恶心了。
你应该考虑一下你的数据库设计。我认为表太多会导致查询过于复杂。放置好的一组视图(或存储过程)可以简化查询逻辑。然而,这不会简化您的整个系统,因为在某些情况下,您必须连接所有这些表。