Asp.net mvc 为模型提供来自数据库的不同数量的数据
假设我有一个在线商店和一个modelUser,其中包含一系列参数(名字、姓氏、地址对象、ProductCategoryAccess对象等) 当前的设置方式是构造函数接受一个Id并用数据库中的数据填充整个类 但如果我不需要这些数据呢?例如,如果我有一个只列出用户的视图,我就必须创建一个用户列表,每个用户都不需要在数据库中查询我不需要的信息(地址、ProductCategoryAccess等)Asp.net mvc 为模型提供来自数据库的不同数量的数据,asp.net-mvc,asp.net-mvc-4,oop,model,Asp.net Mvc,Asp.net Mvc 4,Oop,Model,假设我有一个在线商店和一个modelUser,其中包含一系列参数(名字、姓氏、地址对象、ProductCategoryAccess对象等) 当前的设置方式是构造函数接受一个Id并用数据库中的数据填充整个类 但如果我不需要这些数据呢?例如,如果我有一个只列出用户的视图,我就必须创建一个用户列表,每个用户都不需要在数据库中查询我不需要的信息(地址、ProductCategoryAccess等) 最好的处理方法是什么?我是否创建了一系列不同的类,只包含各种情况下所需的参数?我是否创建一个用户类,但使用
最好的处理方法是什么?我是否创建了一系列不同的类,只包含各种情况下所需的参数?我是否创建一个用户类,但使用不同的“setter”方法,这些方法将使用不同的查询来只填充某些参数?您是否使用任何ORM工具来获取数据?如果是,则可以使用惰性绑定仅检索所需的元素 如果您直接查询数据库,那么使用查询将其划分到不同的方法中就可以了
需要说明的不同情况有哪些?如果只希望从用户数据库记录中选择某些属性,则可以使用投影将记录绑定到数据传输对象中,该对象仅包含任何给定页面所需的属性 例如,如果您需要编辑用户页面的属性,那么您的查询(我假设您使用的是实体框架?)将如下所示:
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返回到服务层或控制器,以将其发送到视图模型中的视图。然后,您可以对需要特定数据的其他可能的数据传输对象和视图进行清洗和重复相同类型的查询。直接查询数据库。至于不同的情况,它可以用于编辑用户(需要大部分模型)、只显示用户名(显示注册用户列表)、只需要知道用户是否是管理员、只需要用户的产品类别访问限制,等等。您让我了解了延迟加载的正确方法。事实证明,你不需要使用ORM来实现这一点。我倾向于两者兼而有之。您的存储库可以有一个方法
List FetchEmployees()
,该方法填充EmployeeItem
的集合,其中只包含ID
和Name
属性,用于在列表(索引视图)中显示,以及一个方法employeeget(int-ID)
返回Employee
,其中包括用于在详细信息或编辑视图中显示的所有属性。其优点是它为您提供了与视图相关的强类型模型。而且Employee
可以从EmployeeItem
继承,所以额外的代码很少。实际上我没有使用EF。