在大多数情况下,课程是事先知道的(例如,客户,订单);它们是使用可视化设计器,代码或配置文件中的属性来描述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查询而无需先在代码中定义模型?
P.S。看起来这样的库存在,而不是.NET。我很想看到像SQLAlchemy,Ruby on Rails ActiveRecord,PHP Yii ActiveRecord,Django Models等。
答案 0 :(得分:1)
Rob Conery的massive可能对您有所帮助。它是一个轻量级,动态的DAL,具有您正在寻找的特殊功能,同时仍然为您提供DAL的一些好处。
因为它是动态的,它不会给你编译时检查或它的一些其他好处更大的兄弟,但它是一个非常方便的小工具,跨越了完整的DAL和原始SQL之间的空间。
答案 1 :(得分:0)
你现在经历了很多痛苦 - 这通常被视为一种反模式。它实际上是,但有时它是必需的(你可能只有这些应用程序之一)。坏消息是 - 没有任何ORM等支持。
大多数ORM可以从数据库生成模型,但这是一个“开发时间”操作,因此当您的数据模型完全不存在时,不可能合理使用。这样 - 我不确定这样的应用程序是如何工作的。
我不知道有任何应用程序 - 基本上有两个极端:SQL作为字符串,通常被认为是任何有线索的人和强类型对象。您的应用程序介于两者之间,与需求相关,这是我认为不支持的内容。
你遇到的一个问题是LINQ是 - 编译时间检查操作,这可以作为休优势,但现在却咬了你。您可能通过将“Entity”对象作为DYNAMIC的基类来工作,然后从那里获取(因为编译器不会在动态对象上抱怨任何内容)。从理论上讲,这可以让你在没有编译时间检查的情况下为LINQ构建一个对象查询集成,但是再次 - 由于缺乏“常见的使用场景”,没有这样的事情存在于IIRC。例如,我会在没有编译时检查时窒息。
答案 2 :(得分:0)
问题的解决方案:Simple.Data by Mark Rendle。它允许在不定义任何类或属性的情况下编写这样的代码:
Database.Open().Users.FindAllByEmail(email).FirstOrDefault()
(Rob Conery's massive库的说明中提到过。)