【发布时间】:2014-11-12 00:12:24
【问题描述】:
我正在尝试创建一种方法来对数据库进行唯一搜索并为我的需要构建正确的对象。我的意思是,我使用返回很多行的 SQL 查询,然后基于该数据库行构建集合。例如:
我们有一个名为People 的表和另一个名为Phones 的表。
假设这是我的 SQL 查询,将返回以下内容:
SELECT
P.[Id], P.[Name], PH.[PhoneNumber]
FROM
[dbo].[People] P
INNER JOIN
[dbo].[Phones] PH ON PH.[Person] = P.[Id]
这就是返回的结果:
1 NICOLAS (123)123-1234
1 NICOLAS (235)235-2356
所以,我的课是:
public interface IModel {
void CastFromReader(IDataReader reader);
}
public class PhoneModel : IModel {
public string PhoneNumber { get; set; }
public PhoneModel() { }
public PhoneModel(IDataReader reader) : this() {
CastFromReader(reader);
}
public void CastFromReader(IDataReader reader) {
PhoneNumber = (string) reader["PhoneNumber"];
}
}
public class PersonModel : IModel {
public int Id { get; set; }
public string Name { get; set; }
public IList<PhoneModel> Phones { get; set; }
public PersonModel() {
Phones = new List<PhoneModel>();
}
public PersonModel(IDataReader reader) : this() {
CastFromReader(reader);
}
public void CastFromReader(IDataReader reader) {
Id = Convert.ToInt32(reader["Id"]);
Name = (string) reader["Name"];
var phone = new PhoneModel();
phone.CastFromReader(reader);
Phones.Add(phone);
// or
Phones.Add(new PhoneModel {
PhoneNumber = (string) reader["PhomeNumber"]
});
}
}
此代码将生成一个带有两个电话号码的PersonModel 对象。到目前为止还不错。
但是,当我想通过此流程管理更多表时,我正在努力寻找一些好的方法来处理。
那么,假设我有一个名为Appointments 的新表。它将用户的约会存储到日程表中。
因此,将此表添加到查询中,结果将是:
1 NICOLAS (123)123-1234 17/09/2014
1 NICOLAS (123)123-1234 19/09/2014
1 NICOLAS (123)123-1234 27/09/2014
1 NICOLAS (235)235-2356 17/09/2014
1 NICOLAS (235)235-2356 19/09/2014
1 NICOLAS (235)235-2356 17/09/2014
正如你们所看到的,问题在于以这种方式管理电话和约会。你能想到任何可以解决这个问题的方法吗?
谢谢大家的意见!
【问题讨论】:
-
问题是什么?问题应遵循来自已定义问题。
-
好吧,也许您应该研究一下如何使用 ORM。这通常是他们的面包和黄油
-
这个问题是为了收集关于这种方法的意见。我不能在这里征求意见,只是问题?
-
@Steve,在这种情况下,我必须使用 ADO.NET,无法使用 ORM,所以我正在努力寻找更好的工作方式,为许多表搜索特定列并在 DTO 中直接翻译。
-
好吧,这取决于你。我只是建议不要重新发明轮子。例如,像Dapper 这样的轻量级 ORM 足以满足您的要求,它只是一个 .cs 文件,可以添加到您的项目中,它使用 ADO.NET。性能也很好。