使用OData和IQueryable的风险

时间:2013-04-02 11:04:53

标签: javascript linq odata iqueryable breeze

我已经看过很多关于制作SPA(单页面应用程序)的教程,其中很多都使用了外部库,如breezejs和jaydatajs,以获得自动数据服务层。

这些库希望我公开他们可以查询的IQueryable对象。

我的问题是,从服务器暴露IQueryable会有什么风险?我想知道如果使用这些js库制作这个快捷方式是值得的,或者我应该在服务器中公开我自己的函数并在客户端自己实现dataservice。

问题是,当暴露Iqueryable时,我可以使用breezejs来创建用于使用linq like语法进行过滤和分页的查询。如果我不使用它,我将不得不在服务器中实现这些过滤和分页功能。并在javascript中实现对它们的调用。

我希望我很清楚: - )

2 个答案:

答案 0 :(得分:5)

在暴露IQueryable时我尝试做一件事......确保你没有暴露你的EF风格对象,总是确保你有一个可以控制的顶部的视图模型。 / p>

举个例子,假设您的数据库有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 - 您仍然可以过滤等,它仍然会在数据库级别执行,但您可以准确控制可以提取的数据(在这种情况下{{1无法访问)。

当然,您也可以应用自己的过滤器,这样就可以避免用户无法访问不允许的数据:

UserSecret

答案 1 :(得分:0)

可以看出,您创建DTO对象以投影实体对象并尝试在此DTO上创建基本属性。此操作将使我们能够保护自己从数据库中公开的信息,并避免从服务端向客户端泄露一些秘密信息。