我的情况
我有一个包含一些列表的 c# 对象。例如,这些列表之一是标签列表,它是 c#“SystemTag”-objects 的列表。 我想以最有效的方式实例化这个对象 .
在我的数据库结构中,我有以下表格:
(我还有其他几种类似的数据)
我现在就是这样做的...
这真的是低效的,我们有很多对数据库的调用。这尤其会带来问题,因为我有 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 ....
但是,这会检索与标记连接一样多的对象 - 所以我不认为连接是执行此操作的好方法。
其他信息...
...
那么 - 我如何尽可能有效地解决这个问题? :-) 谢谢!
最佳答案
乍一看,我不认为您目前的工作方式“效率低下”(根据提供的信息)。我会替换代码:
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/