1

在大多数情况下,类是事先知道的(例如 Customer、Order);使用可视化设计器、代码或配置文件中的属性为 ORM(例如实体框架、LINQ to SQL、NHibernate、BLToolkit)描述了它们。例如,当您需要使用 Customer 类的对象时,您可以编写如下强类型查询:

db.Customers
  .Where(c => c.FirstName == "John")
  .Select(c => new { c.Id, c.LastName })
  .GroupBy(c => c.Id)

但是,在我的应用程序中,输入数据将被处理为用户在运行时定义的模型。用户将能够添加和删除属性,因此我无法在代码中定义模型。这将需要手动生成字符串 SQL 查询的想法让我感到恐惧。我希望能够编写这样的代码:

db.Tables["Customers"]
  .Where("c.FirstName = :FirstName")
  .Select(new[] { "c.Id", "c.LastName" })
  .GroupBy("c.Id")
  .Param(":FirstName", "John")

(只是示例发明的语法。)

问题:是否有一个 .NET 库可以帮助构建复杂的 SQL 查询,而无需先在代码中定义模型?

PS 看起来像这样的库存在,只是不适用于 .NET。我很想看到 SQLAlchemy、Ruby on Rails ActiveRecord、PHP Yii ActiveRecord、Django 模型等。

4

3 回答 3

1

Rob Conery 的大量可能对您有所帮助。它是一种轻量级的动态 DAL,具有您正在寻找的临时功能,同时仍为您提供 DAL 的一些好处。

因为它是动态的,所以它不会为您提供编译时检查或它的一些其他好处],但它是一个非常方便的小工具,跨越了完整的 DAL 和原始 SQL 之间的空间。

于 2012-11-25T16:17:23.800 回答
0

你现在很痛苦——这通常被视为一种反模式。它实际上是,但有时它是必需的(你可能只有其中一个应用程序)。坏消息是 - 没有任何 ORM 等的支持。

大多数 ORM 可以从数据库生成模型,但这是一个“开发时间”操作,因此当您的数据模型完全不存在时,就不可能明智地使用它。那就是说-我不确定这样的应用程序甚至会如何工作。

我不知道有任何应用程序 - 基本上有两个极端:作为字符串的 SQL,通常被任何有线索的人认为是不好的,以及强类型对象。从要求来看,您的应用程序介于两者之间,我认为这是不支持的。

您面临的一个问题是 LINQ 是 - 编译时检查操作,这被认为是巨大的优势,但现在它会咬你。您可以通过将“实体”对象作为 DYNAMIC 的基类来工作,然后从那里获取它(因为编译器不会抱怨动态对象上的任何内容)。从理论上讲,这可以让您在没有编译时检查的情况下为 LINQ 构建对象查询集成,但同样 - 由于缺乏“常见使用场景”,IIRC 不存在这样的事情。例如,我会因为没有编译时检查而窒息。

于 2012-11-25T15:58:03.673 回答
0

问题的解决方案:Mark Rendle的Simple.Data。它允许在不定义任何类或属性的情况下编写这样的代码:

Database.Open().Users.FindAllByEmail(email).FirstOrDefault()

(在Rob Conery 庞大的图书馆的描述中提到过。)

于 2012-12-12T12:00:52.267 回答