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

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

我的情况

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

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

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

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

    我现在就是这样做的...
  • 使用 ID
  • 从数据库中检索我的对象
  • 将 DB 对象发送到“对象工厂”模式,然后意识到我们必须获取标签(和其他列表)。然后它使用我们的 C# 对象的 ID
  • 向 DAL 层发送一个调用。
  • DAL 层从数据库中检索数据
  • 这些数据被发送到一个“TagFactory”模式,该模式转换为标签
  • 我们回到对象工厂

  • 这真的是低效的,我们有很多对数据库的调用。这尤其会带来问题,因为我有 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 对象转换)

  • ...

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

    最佳答案

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

    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 )并填充对象实例,然后再次查询数据库以恢复您可能需要的所有卫星数据(标签在你的情况下)。

    您对您的场景更加简洁,以便我们可以为您的特定场景提供有值(value)的建议。希望这对你有用。

    关于asp.net - 从数据库加载对象列表以实例化单个对象的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12542587/

    相关文章:

    c# - 通过创建文件夹并嵌套文件夹或创建带点的文件夹名称来创建命名空间?

    javascript - Web 方法未被调用

    sql - 一定数量的记录后,Postgres 服务器性能下降

    asp.net - 为什么在添加新的响应头时得到 "Platform Not Supported Exception"?

    asp.net - 如何在asp.net.vb中提交按钮?

    mysql - SQL 语法 UPDATE 语句

    mysql - MySQL 中 where 子句和别名的问题

    sql - WHERE 列不是 '$value' 吗?

    java - 存储一组静态字符串值的最佳方法

    php - XML 与 MySQL 直接查询性能