在公开 IQueryable 时,我尝试做一件事...确保您不公开您的 EF 样式对象,始终确保您有一个可以控制的位于顶部的某种视图模型。
举个例子,假设你的数据库有 User 和 UserSecrets
public class User
{
public long UserId { get; set; }
public string Name { get; set; }
public virtual ICollection<UserSecret> UserSecrets { get; set; }
}
public class UserSecret
{
public long UserSecretId { get; set; }
public long UserId { get; set; }
public string Secret { get; set; }
}
如果您公开IQueryable<User>
,您也可以轻松提取 UserSecrets
www.blah.com/users?$expand=UserSecrets
而是公开一个UserViewModel
或类似的东西
public class UserViewModel
{
public string Name { get; set; }
}
IQueryable<UserViewModel>
您可以通过以下方式公开:
return dbContext.Users.Select(u => new UserViewModel { Name = u.Name })
很棒的是,这仍然是IQueryable
- 您仍然可以过滤等,它仍将在 db 级别执行,但您可以准确控制可以提取哪些数据(在这种情况下UserSecret
不再可访问)。
当然,您也可以应用自己的过滤器,这样您就可以避免用户无法访问他们不允许的数据:
return dbContext.Users.Where(u => ...).Select(u => new UserViewModel { Name = u.Name })