1

我正在尝试制作一个应用程序,其中允许开发人员和最终用户从关系数据库(在运行时选择)中检索数据,而无需编写任何 SQL 代码(最好在与数据库交互时不使用字符串连接)。该应用程序的目的有两个:表达式树构建器的 GUI 和由它生成的树的 XML 序列化。

我想请教一些关于如何让事情顺利进行的指导或提示。我不想让其他人为我写这个 - 这是我的项目,我将成为编写代码的人。

所以我的问题是:

  1. 是否有可能仅在运行时仅使用连接字符串来创建对象模型并以集合的形式寻址 DB 的元素 - 例如所有表、视图、函数和存储过程的列表?

  2. 是否可以在扩展方法中使用上述列表的元素,以便构建表达式树?

  3. 我可以使用 Metadata Workspace 类和 ItemCollections 从只有 CSDL、SSDL 和 MDL 文件(但没有实体类)的数据库中检索这些列表吗?

  4. 我是否可以使用 LINQ to XML 来序列化表达式树的结果,或者我将不得不使用其他一些特定于实体框架的序列化技术?(如此处所示的示例:http: //msdn.microsoft.com/en-us/library/bb738528.aspx

PS:以下是我迄今为止研究的一些笔记: 1. 例如,当 DataContext 仅接收到一个连接字符串时,DataContext.GetTable() 方法(是的,弱类型的,不是泛型的)没有检索任何数据。

  1. 我正在调用 EdmGen 工具以生成架构工件,到目前为止,我已经阅读了它们的属性,但我仍在尝试获取某种可以在 lambda 表达式中使用的元素列表(例如表格) ?

  2. 如果我理解正确,在实体框架中,我可以使用诸如 Metadata Workspace 和 ItemCollections 之类的类以及 EdmGen 工具来创建必要的对象集,用这些对象集将概念模式表示为应用程序中的对象模型。

我已经在这里和 MSDN 上浏览了其他相关主题的实体框架编程指南,但到目前为止,我还没有找到与此方案相关的任何信息。昨天拿到了《Programming Entity Framework》这本书,希望里面有一些答案。如果我找到任何线索,我会更新这个问题。

所以,困惑和仍在寻找,我提前感谢你对此事的任何帮助。

最好的问候, 鲍里斯拉夫

4

2 回答 2

1

再次非常感谢戴夫发表他对此事的看法。

以下是我迄今为止的研究总结:

我放弃 LINQ to Entities 转而使用 LINQ to SQL - 看起来这会让我在这个项目上更轻松。

所以这里再次是我的问题以及我到目前为止的答案和评论:

  1. 是否有可能仅在运行时仅使用连接字符串来创建对象模型并以集合的形式寻址 DB 的元素 - 例如所有表、视图、函数和存储过程的列表?

@Dave-实际上这是可能的-我查看了LINQPad官方网站的“LINQPad如何工作”部分,答案是:使用Reflection.Emit在运行时生成类以创建方法的内存占用,属性及其属性,然后基于它们创建类。另外,我从 MSDN 上的一位版主那里得到了这个提示:http: //social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/471c8672-0a77-4186-b1d3-844abd8a822b 所以在某种程度上我认为它是可以在运行时检索对象模型。

  1. 是否可以在扩展方法中使用上述列表的元素,以便构建表达式树?

3.我可以使用 Metadata Workspace 类和 ItemCollections 从只有 CSDL、SSDL 和 MDL 文件(但没有实体类)的数据库中检索这些列表吗?

我想我没有在这里问正确的问题——我的意思是:在运行时你知道有一个表 Table 列 Col1、Col2 和 Col3。在一个简单的 LINQ to SQL 应用程序中,代码是

Table.Select(t => t.Col1, t.Col2, Col3)

但是我正在寻找这个:用户选择哪些列参与选择,因此最终选择将是这样的:

foreach(String UsersChosenColumn in TableColumnsArray)
   XDocumentXElement(UsersChosenColumn, (Table.Select(t => t.TableColumnsArray[UsersChosenColumn]))

然而,这不能完成,因为找出列的名称是不够的 - 知道列的类型才能完成工作。我现在正在研究这个问题,但仅针对 LINQ to SQL,而不是 LINQ to Entities - 那里的逻辑可能有所不同。

@Dave:这是项目的一个场景:用户想要获取以下数据的 XML:Orders.Name、Order.Price、Orders.Products.Name、Orders.Products.Manufacturer 其中 Orders.OrderID = 1234。

这是输出应该是什么:

<Order>
 <Name>Some Order Name</OrderName>
 <Price>Some Price</Price>
  <Products>
   <Product>
     <Name>Some Product Name</Name>
     <Manufacturer>Shady Company Inc</Manufacturer>
   </Product>
   <Product>
     <Name>Some Product Name 2</Name>
     <Manufacturer>Another Company (TM)</Manufacturer>
   </Product>
  </Products>
</Order>

由于我已经在这个问题上放置了 EF 标签,我将关闭它,因为现在我正在寻找 LINQ to SQL 的答案,没有 EF。

如果我询问有关此主题的其他问题,我将尝试将适当的 LINQ to SQL 标记附加到它。

一切顺利,鲍里斯拉夫。

于 2009-09-06T17:19:05.130 回答
0

这些问题重于理论而轻于应用,因此很难理解您要完成的工作。根据我从您的问题中可以理解的内容,这是我的最佳答案。如果您将更新有关您的要求的一些详细信息,我可以对其进行改进。


1:这听起来像“我的实体模型可以在运行时使用连接字符串自动生成以包含我所有的数据库对象吗?”:

不。您的实体模型由您的实体数据模型定义(即MyModel.edmx.)这用于生成对象服务类,MyModelEntities. 该模型必须存在并且可用,以便实体框架提供程序对其执行查询。

2:如果“表达式树”是指 lambda 或 LINQ 语法:

任何实现 IEnumerable、IQueryable 或其他类似接口的集合对象都可以使用 LINQ ( from i in EntitySet... select i) 或 lambda ( .Where(x=>x.Id == 5)) 语法进行查询。

3:如果你的意思是,能不能单独使用EDM定义(CSDL、SSDL、MDL)直接查询数据库:

这就是 LINQ to Entities 所做的:将 LINQ 查询转换为 SQL 查询。为什么要重塑 L2E 提供商?

4:实体对象序列化在 EF v1 中有点奇怪(阅读:损坏)。Entity 对象带有很多 EF 包袱(它们派生自 EntityObject 并带有额外的属性),因此序列化可能很困难。它对您的效果如何取决于您的实体对象以及它们被序列化后您如何处理它们。

于 2009-08-25T20:19:42.700 回答