在公开 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 - 你仍然可以过滤等,它仍然会在数据库级别执行,但是你可以控制可以提取哪些数据(在这种情况下UserSecret 不是更容易访问)。
当然,您也可以应用自己的过滤器,这样您就可以避免用户无法访问他们不允许的数据:
return dbContext.Users.Where(u => ...).Select(u => new UserViewModel { Name = u.Name })