【问题标题】:Generating completely dynamic SQL with linq使用 linq 生成完全动态的 SQL
【发布时间】:2013-04-08 21:34:31
【问题描述】:

我使用 Linq to Entity Framework 已经有一段时间了,并且一直很喜欢它。

但是,我现在需要在 sql server 上查询一个完全动态的数据库表。我不知道编译时的表名、结构或列名。

有没有办法使用类似 Linq 的语法来编译 SQL 查询?我在运行时获得了表名和列名,我需要使用 order by 进行复杂的搜索(例如 where cola = x and (cola = y or colb = z) or (colc in n..p))并可能分组

我发现了一些看起来很有希望的东西,http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx,但我不明白 a) 如何动态选择任意表 b) 如何防止注入。作者说“第 2 部分”中还有更多内容 - 但我找不到任何指向它的链接,并且该博客来自 2008 年。

我在想象一些语法,比如

public void SelectPizzasCheaperThan(int price) {
    var table = con.selectDB(tablename);
    var result = table.where(x => x.Field<string>("Food") = "Pizza");
    result = result.where(x => x.Field<int>("price") < price);
    result = result.select(x => new {Name = field<string>("Name"), Price = field<int>("price")}).ToList();
}

(显然,那些硬编码的字符串将是在运行时定义的任意变量)

已经有类似的东西了吗?尤其是来自微软的任何东西?

感谢阅读

【问题讨论】:

  • 如果数据库是完全动态的并且在编译时不知道,那么为什么要使用 EF?
  • 抱歉,我不打算使用 EF。但是,我确实喜欢具有注入安全性和惰性求值的 EF 语法。我想知道是否有任何类似于 EF 的东西,但没有编译时实体
  • 您追求的不是“EF 语法”。它被称为 LINQ。有 LINQ to XML、LINQ to Objects,甚至 LINQ to SQL 等。它们中的每一个都可能有自己特定的方法来处理它们正在使用的数据类型,但语法是相似的。
  • @Nick 是的,有 SQL to LINQ,但没有已知的数据库可以创建,并且从中丢失了很多对象模型。
  • 你没有阅读我的评论。我指出 LINQ 并非特定于实体框架。

标签: .net sql linq dynamic-sql


【解决方案1】:

参数是注入安全的。

SqlCommand.Parameters Property

对 SqlDbType 使用 switch(if elseif),但您可以动态构建它们。

【讨论】:

  • 我遇到的问题是“Dim commandText As String = _”UPDATE Sales.Store SET Demographics = @demographics“_&“WHERE CustomerID = @ID;”“有没有办法做一个动态的sql语句?例如。使用通过惰性求值 linq 生成的解析树,并编译 SQL 字符串?
  • 我不知道。 LINQ EF 是编译时。你说表和列在编译时是不知道的。数据库引擎是编译 SQL 语句的东西。字符串(命令文本)是一个变量,可以在运行时赋值。
  • 你能解释一下你所说的数据库引擎是什么意思吗?我假设 linq to ef 只是使用编译时提供的数据的反射,是否可以在运行时使用这个“数据库引擎”来确保 SQL 语句和解析树的正确性?
  • 但是你说你在编译时没有表或列。您不会在编译时构建强类型 LINQ。 .NET 编译器不了解 SQL 语法。如果语法失败,则 SQL 将抛出错误。即使使用动态 LINQ,如果表名或“食物”错误,LINQ 也不会捕捉到它 - SQL 会抛出错误。
  • 如果列不存在,SQL 会抛出错误,我可以理解,我知道编译器无法捕捉到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
相关资源
最近更新 更多