IQueryable を公開するときに私がやろうとしていることが 1 つあります... EF スタイル オブジェクトを公開しないようにしてください。常に、制御できる上にある種のビュー モデルがあることを確認してください。
例として、DB に 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 })