C# 使用SQL在OOP C应用程序中使用数据访问层

C# 使用SQL在OOP C应用程序中使用数据访问层,c#,sql,data-access-layer,C#,Sql,Data Access Layer,我所处的环境教我如何使用对象,并在可能的情况下使用OOP技术,我想这已经引导我走上了一条特殊的道路,并在相当长的一段时间内影响了我的产品设计 通常,我的数据访问层将有许多类映射到数据库表上,因此如果需要显示公司列表,我将有一个“Company”对象和一个名为“Company”的数据库表。company对象知道如何使用“SELECT*fromcompany WHERE id=x”类型的查询从数据库读取的数据行实例化自己。因此,每当我显示一个公司列表时,我都会填充一个公司对象列表并显示它们。如果我需

我所处的环境教我如何使用对象,并在可能的情况下使用OOP技术,我想这已经引导我走上了一条特殊的道路,并在相当长的一段时间内影响了我的产品设计

通常,我的数据访问层将有许多类映射到数据库表上,因此如果需要显示公司列表,我将有一个“Company”对象和一个名为“Company”的数据库表。company对象知道如何使用“SELECT*fromcompany WHERE id=x”类型的查询从数据库读取的数据行实例化自己。因此,每当我显示一个公司列表时,我都会填充一个公司对象列表并显示它们。如果我需要显示公司的属性,我已经加载了数据

有人提到,“select*”是不受欢迎的,我的对象方法可能效率低下,但我在确定处理数据库表和对象的另一种方法时遇到了问题,如果您只读取特定字段,这种方法就会起作用-对象就不会被填充

是的,我可以将列表更改为直接从数据库中查询所需字段并显示它们,但这意味着我的UI代码需要与数据访问代码更紧密地链接-我个人喜欢对象分离层的分离程度


但我始终愿意学习——我自己工作,所以不总是掌握最新的技术或方法,所以欢迎发表任何评论。

我不认为我能为您提供一个明确的解决方案,但我会尝试为您指出正确的方向,因为这更像是一个理论问题

根据应用程序所遵循的设计模式,可以将数据访问层与UI分离,并在不需要时仍遵循不获取所有列的规则。我的意思是,为应用程序选择正确的设计模式可以为您带来这种便利

例如,也许你可以将一个对象的不太详细的版本解释为一个对象本身,老实说,我认为这不是一个好方法


此外,我还要指出,非常流行的rails ORM ActiveRecord仅在使用数据时从DB中获取数据。也许您可以使用类似的逻辑不仅跟踪何时使用,而且跟踪将使用哪些列,这样您就可以限制查询。

虽然我不一定不赞成*,但我不明白您的问题所在。如果您的视点是对象,并且它知道它的持久表示,那么它确切地知道它的属性以及这些属性映射到哪些列。所以它可以很容易地创建列列表,不是吗?在这一点上,这与UI无关。到底什么东西会显示给用户还是不显示给用户还需要几步的时间。是的,我想可以,但重点是什么?select*是否比select后跟一长串列名更糟糕?我想我的问题更多的是关于其他人使用什么技术,因为我已经有10年左右没有机会与其他程序员合作了。我已经采用了对象映射到表的方法,并坚持了很长一段时间——虽然可能不是最好的方法!论点是,*真的得到了一切,即使不需要。但这是否有明显的影响是另一个问题。例如,假设您有一个包含大blob的表,但应用程序中相应对象上的常见任务不需要这些blob,那么在真正需要这些blob之前不获取这些blob可能会产生明显的影响。另一个例子是按列划分的表。只要选择always all columns(总是所有列)将使其变得毫无用处。当然,连接质量也起到了作用。数据库服务器是否在同一台计算机上,数据通过Unix域套接字或环回接口传送,或者中间是否有LAN甚至WAN。取决于这一点,甚至可能更重要的是,只取所需的最小值,只按需取大体积的东西可能是一件好事。就像一个获取BLOB的getter,如果它真的被访问,它将获取一个以前从未被获取过的BLOB。但对于少数名称和数字,如果连续获取少量数据甚至没有更大的影响,我想这种影响是可以忽略的。代码密集度较低的选项是使用ORM对象关系映射器,如Entity Framework,它可以有效地为您编写大部分数据层代码,因此您可以专注于业务逻辑。因此,例如,如果您想要区域1中所有公司的列表,在EF语言中,您只需编写类似于list companys=db.companys.Wherec=>c.region==1.ToList;。所有SQL都是由EF自动生成的。这与当前设置的原理相同。有其他可用的ORM,您可以搜索。不过,偶尔使用更复杂的东西时,它们会生成低效的SQL。