我有一个名为GetCustomer
的方法,它返回一个Customer对象。
客户对象如下。
Public class Customer
{
public int Id { get; set;}
public string Name { get; set;}
public int CompanyId { get; set;}
}
假设客户与公司有关,我必须在屏幕UI上显示此客户信息。现在,当我调用GetCustomer
方法时,我只收回有关客户的详细信息。在屏幕上,我还需要显示该客户所属的companyname
。
一种简单的方法是在客户对象中使用名为CompanyName
的属性,并从datalayer方法填充它。但我不确定这是不是最好的做法。如果客户也属于department
,那么现在我需要DepartmentId
和DeptName
作为属性。 Ids是必须的,因为有时我需要发送Id以获得完整的Dept / Company对象。
我不想在Customer对象中拥有Department and Company
的完整对象。
我认为这是一个常见的场景,其中特定对象使用ID链接到其他对象,当您带回主对象时,您只需要显示其他链接对象的名称。
处理此问题的最佳方法是什么。我的主要目的是避免(或更多)额外的数据库调用。
我没有使用Linq or Entity Framework
,只是常规ADO.NET
。
答案 0 :(得分:0)
这种情况取决于您的目标;
1 - 如果你想避免额外的数据库调用,你必须通过只有一个实例的数据库通信器对你的UI进行编码,只打开一次并在每次制作后刷新其成员(适配器,命令..等)。 DB调用并在数据传输结束时关闭连接。
2 - 出于问题的其他目的,请使用延迟加载。只在您的实体上放置id,并在需要时初始化并使用id的所属实体!
例如:
public class Customer
{
public int Id { get; set;}
public string Name { get; set;}
public int CompanyId { get; set;}
}
public class Company
{
public int CompanyId;
//company fields
}
// .. on your business layer if you need to use Company data:
// examine your Customer instance as "customer"
Company userCompany = GetCompanyWithId(customer.CompanyId);
但是您对猜测毫无疑问,将要加载的数据取决于您的需求。想想简单。如果您只需要部门和公司名称,那么您可以在数据库上创建一个视图,并可以在您的代码上调用它。您可以将实体创建为CustomerWithFullData
,并且可以将客户和部门等放在此实体中,当您需要显示完整数据时,可以使用DB View填充该数据。或者不打扰创建实体。如果您不需要实体,请直接调用DB View查看DataSet并绑定表。因此,您可以将数据收集工作传输到DB,这就是我们想要做的。
正如我之前所说,想想简单。
答案 1 :(得分:0)
我要做的是在业务对象级别保留OO结构,并修改DAL以通过单个数据库往返返回所需的所有信息。
例如,您可以拥有一个返回两个结果集的存储过程:一个用于Customers,另一个用于它们引用的公司。您可以使用表值参数向SP传递一个或多个客户的列表以进行查找。
根据数据库的大小和性能要求,您还可以在应用启动时将整个Customer和Company表读入内存,缓存结果,并管理针对该数据的插入/更新/删除。