从数据库加载对象列表以实例化单个对象的有效方法

时间:2012-09-22 09:30:39

标签: asp.net sql performance linq-to-sql

我的情况

我有一个包含一些列表的c#对象。其中一个列表例如是标签列表,它是c#“SystemTag”对象的列表。 我想以最有效的方式实例化此对象

在我的数据库结构中,我有以下表格:

  • dbObject - 包含有关我的c#object的基本信息的表
  • dbTags - 所有可用选项卡的列表
  • dbTagConnections - 一个包含2个字段的列表:TagID和ObjectID(以确保对象可以有多个标记)

(我还有其他几种类似的数据)

这就是我现在的表现......

  1. 使用ID
  2. 从数据库中检索我的对象
  3. 将DB对象发送到“对象工厂”模式,然后实现我们必须获取标签(和其他列表)。然后它使用我们的C#对象的ID
  4. 向DAL层发送调用
  5. DAL层从数据库中检索数据
  6. 这些数据被发送到“TagFactory”模式,该模式转换为标签
  7. 我们回到了对象工厂
  8. 这实在是效率低下,我们对数据库进行了很多调用。这特别给出了问题,因为我有4种以上的列表。

    我尝试了什么?

    我不擅长SQL,但我尝试了以下查询:

    SELECT * FROM dbObject p
    LEFT JOIN dbTagConnection c on p.Id=  c.PointId
    LEFT JOIN dbTags t on c.TagId = t.dbTagId
    WHERE ....
    

    但是,这会像标记连接那样检索多个对象 - 所以我认为连接不是一种很好的方法。

    其他信息......

    • 使用.NET Framework 4.0
    • 使用LINQ to SQL(BLL和DAL层在BLL中使用工厂模式从DAL对象转换)

    ...

    那么 - 如何尽可能高效地解决这个问题呢? :-)谢谢!

4 个答案:

答案 0 :(得分:1)

我们使用返回多个结果集的存储过程,在使用Java / MSSQL服务器/ Plain JDBC的先前项目中的类似情况下。

存储过程获取与要检索的对象相对应的ID,返回行以构建主对象,然后是与主对象的每个一对多关系的多个记录。这使我们能够在单个数据库交互中完整地构建对象。

答案 1 :(得分:1)

您是否考虑过使用实体框架?然后,您将以与应用程序中任何其他类型的类交互相同的方式与数据库进行交互。

设置起来非常简单,您可以在实体设计器中创建数据库表之间的关系 - 这将为您提供调用相关对象所需的所有外键。如果您在数据库中设置了所有密钥,那么实体设计人员将使用这些密钥 - 创建所有对象就像选择“从数据库创建模型”一样简单,当您对数据库进行更改时,只需右键单击设计师并选择“从数据库更新模型”

框架会为您处理所有SQL - 因此您无需担心这一点;在大多数情况下..

启动并运行此功能的一个很好的起点是herehere

完成所有设置后,您可以使用LINQ轻松查询数据库。

你会发现这比下台适配器路由更有效率(假设你现在正在做什么?)

很抱歉,如果我错过了什么,而你已经在使用这个......:)

答案 2 :(得分:1)

乍一看,我并不认为您目前的工作方式“效率低下”(提供的信息)。我会替换代码:

SELECT * FROM dbObject p
LEFT JOIN dbTagConnection c on p.Id=  c.PointId
LEFT JOIN dbTags t on c.TagId = t.dbTagId
WHERE ...

通过对DALs方法的两次调用,首先检索对象主数据(1),然后再检索一个与之相关的标记数据(2),以便工厂可以填充对象的标签列表:

(1)

SELECT * FROM dbObject WHERE Id=@objectId

(2)

SELECT t.* FROM dbTags t
INNER JOIN dbTag Connection c ON c.TagId = t.dbTagId
INNER JOIN dbObject p ON p.Id = c.PointId
WHERE p.Id=@objectId

如果您有很多对象且数据量很少(意味着您不会管理大量数据),那么我会寻找基于ORM的解决方案Entity Framework

我(仍然)觉得在DAO中编写SQL查询以控制所有发送到数据库服务器的查询都很舒服,但最后是因为在我们的情况下需要。我没有看到任何不方便查询数据库以恢复,首先是对象数据(SELECT * FROM dbObject WHERE ID=@myId)并填充对象实例,然后再次查询数据库以恢复您可能需要的所有卫星数据(你案子中的标签。)

您对自己的方案更加简洁,以便我们能够为您的特定方案提供有价值的建议。希望这对你有用。

答案 3 :(得分:0)

据我所知,您的数据库已经存在,并且您对SQL非常熟悉。

您可能希望使用Micro ORM,例如 petapoco

要使用它,您必须编写与数据库中的表匹配的类(有T4生成器可以使用Visual Studio 2010自动执行此操作),然后您可以编写包装器来创建更丰富的业务对象(您可以使用ValueInjecter要做,它比我用过的更简单,或者你可以按原样使用它们。

Petapoco处理插入/更新操作,并自动检索生成的ID。

因为Petapoco handles multiple relationships也是如此,它似乎符合您的要求。