Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用OData和IQueryable的风险_Javascript_Linq_Odata_Iqueryable_Breeze - Fatal编程技术网

Javascript 使用OData和IQueryable的风险

Javascript 使用OData和IQueryable的风险,javascript,linq,odata,iqueryable,breeze,Javascript,Linq,Odata,Iqueryable,Breeze,我看过许多关于制作SPA(单页应用程序)的教程,其中许多教程使用了外部库,如breezejs和jaydatajs,以获得自动化的数据服务层 这些库希望我公开一个IQueryable对象,它们可以查询这个对象 我的问题是,从服务器公开IQueryable有什么风险?我想知道用那些js库创建这个快捷方式是否值得,或者我应该在服务器中公开我自己的函数,并在客户机中实现数据服务 问题是,在公开Iqueryable时,我可以使用breezejs创建查询,以便使用类似linq的语法进行过滤和分页。如果我不使

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

这些库希望我公开一个IQueryable对象,它们可以查询这个对象

我的问题是,从服务器公开IQueryable有什么风险?我想知道用那些js库创建这个快捷方式是否值得,或者我应该在服务器中公开我自己的函数,并在客户机中实现数据服务

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


我希望我说得很清楚:-)

当我暴露IQueryable时,我试着做一件事。。。确保不公开EF样式的对象,始终确保在顶部有某种类型的视图模型,可以进行控制

举个例子,假设您的数据库有用户和用户机密

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; }
}
而是公开一个
UserViewModel
或类似的东西

public class UserViewModel
{
     public string Name { get; set; }
} 
您可以通过以下方式公开
IQueryable

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 })

有一件事,我试图做的时候,暴露IQueryable。。。确保不公开EF样式的对象,始终确保在顶部有某种类型的视图模型,可以进行控制

举个例子,假设您的数据库有用户和用户机密

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; }
}
而是公开一个
UserViewModel
或类似的东西

public class UserViewModel
{
     public string Name { get; set; }
} 
您可以通过以下方式公开
IQueryable

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 })

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

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

好的,这似乎是一个很好的解决方案,所以你要说的是,我不应该公开DB实体,而应该只公开这些实体的投影。是的,如果需要的话,还可以预过滤你的查询。这个解决方案不能处理更复杂的问题,即一些用户能够看到用户机密,而一些用户看不到。好的,这似乎是一个很好的解决方案,所以您要说的是,我不应该公开DB实体,而应该只公开这些实体的投影。是的,如果需要,还可以预过滤您的查询。此解决方案无法处理更复杂的问题,即一些用户能够看到用户机密,而另一些用户看不到。