假设我有一个在线商店和一个模型用户,其中包含一大堆参数(名字,姓氏,地址对象,ProductCategoryAccess对象等)
它当前设置的方式是构造函数接受Id并使用数据库中的数据填充整个类。
但如果我不需要所有这些数据呢?例如,如果我有一个只列出用户的视图,我必须创建一个用户列表,每个用户都不必要地查询数据库以获取我不需要的信息(Address,ProductCategoryAccess等等) )。
处理此问题的最佳方法是什么?我是否创建了一堆不同的类,只有各种情况下我需要的参数?我是否创建了一个User类,但使用了不同的" setter"方法,它将使用不同的查询来仅填充某些参数?
答案 0 :(得分:0)
您是否使用任何ORM工具来获取数据?如果是,那么您可以使用延迟绑定来仅检索您需要的元素。
如果你直接查询数据库,那么用不同的方法将它与查询分开应该可以解决问题。
您需要考虑哪些不同的情况?
答案 1 :(得分:0)
如果您只想从用户数据库记录中选择某些属性,则可以使用投影将记录绑定到数据传输对象中,该对象仅包含任何给定页面所需的属性。
例如,如果您需要编辑用户页面的属性,那么您的查询(我假设您正在使用实体框架?)看起来像这样:
this.userContext.Users.Where(y => y.UserId == userId).Select(x => new UserEditDto {
FirstName = x.FirstName,
Surname = x.Surname,
EmailAddress = x.EmailAddress
}).FirstOrDefault();
这样做是针对数据库构建LINQ查询,该查询仅选择LINQ语句的select
部分中指定的属性。实际上,如果您要删除FirstOfDefault()
方法并在您的断点中添加断点,则可以看到该语句生成的SQL看起来有点像:
SELECT FirstName, Surname, EmailAddress FROM users WHERE userId = 1;
仅当您调用.FirstOrDefault()
时,LINQ提供程序才会对数据库执行查询并返回结果。
从这里,您可以将DTO返回到服务层或控制器,以将其发送到视图模型中的视图。然后,您可以为需要特定数据的其他可能的数据传输对象和视图冲洗并重复此类查询。