【发布时间】:2010-09-23 00:10:09
【问题描述】:
我有一个使用动态查询的 2.0 服务器控件,格式大致如下:
string sql = "Select " + columnvariable + " FROM " + tablenamevariable
因此,显然,您可以从数据库中的任何有效表中为其指定任何有效的列名,并且它将列中的值返回到 DataReader(在这种情况下)。
我正在尝试减少代码库中显式零碎 SQL 的数量,并且更愿意在 LINQ 中执行此操作。是否有捷径可寻?它甚至是可取的吗?我想在这种情况下生成的零碎 SQL 会非常通用,以至于在这种情况下不会真正造成安全问题。
即便如此,这似乎是一些相当基本的功能,所以我很好奇。我已经在我的项目中包含 System.Linq.Dynamic ,但这似乎不再允许程序员动态选择他们想要动态列的表。
我并不是要讨论这个问题。我想要一个像“是的,这是可能的而且微不足道的,这就是如何……”或“是的,但前提是您构建了这套精心设计的处理程序类并基本上重写了 LINQ 的部分,这就是如何……”这样的答案。
然而,我很想知道人们是否认为在 LINQ 中做这种事情最好被描述为 a) 一个愉快的好主意或 b) 疯狂的谈话。
【问题讨论】:
-
LINQ to SQL : msdn.microsoft.com/en-us/library/bb425822.aspx
-
不完全是我的想法......也许可以举个例子......
-
在可能的情况下摆脱它可能是个好主意。您是否考虑过如果(例如通过恶意用户输入)
tablenamevariable变为" myTable; DROP TABLE ReallyImportantTable;"会发生什么情况。阅读 SQL 注入。 -
@Winston:这是一个很好的观点。这种注入的风险很小,因为数据将通过定制服务器控件的配置属性输入,只有我们组织的技术人员才能访问。当有权访问控件的人想要做类似的事情时,他们会用更简单、更具破坏性的方式来做这件事。即便如此……如果可以的话,我宁愿安全也不愿后悔。因此,原来的问题。到目前为止,我不得不问“我还有什么其他选择?”