我需要为我的数据库中的每个表创建一个类吗?

4

我正在努力理解LINQ,据我所知,LINQ将成为您与数据库交互的数据访问层(DAL)。它会自动为您创建一个映射数据库结构的类,然后您可以使用该类执行查询操作。

  • 我正在尝试编写一个函数,以返回我的LINQ查询结果。
    • 所有我看过的例子都似乎表明,如果我想要我的查询结果是一个特定类型,我必须为其创建一个特定的类,并将其用作列表。

我的理解是否正确?请给我指点。

3个回答

6
"Linq"并不是ORM技术,它只是一种在.Net语言中编写查询语句的方式。您没有说明您是否使用Linq to SQL或Linq to Entities,这两种ORM技术都可以使用Linq将数据模式映射到表格。
Linq to SQL将为您提供每个表格的直接映射到一个类,并处理大部分工作。您的查询可以返回这些类型,或者使用您的Linq表达式,您可以将这些类型“投影”到其他由您自己制作的类型。
如果您需要更多的灵活性,Entity Framework将允许您将单个表格映射到多个实体,将多个表格映射到单个实体等。要做到这一点,您必须自己进行更多的工作,因为您必须手动修改映射。与Linq to SQL类似,查询可以返回这些生成的类型或在查询中指定自己的类型。

我正在尝试创建一个函数来运行Linq查询并返回结果..我想要的是..从表“NDT_Equipment”返回所有记录public List<NDT_Equipment> GetALLRecords() { using (NDT_DB) { return (from a in NDT_DB.NDTEquipment select a); } }其中:NDT_DB - 数据库上下文类的类实例(自动生成): NDT_Equipment - 数据库上下文类中的部分类我无法编译此代码..我得到了“是否缺少转换”的错误提示。 - Dennis
@Dennis,请编辑您的帖子并添加这个问题,还有您正在使用哪个ORM? - Chris Pitman
抱歉发帖时没有添加段落评论,我不太熟悉如何添加。 :) - Dennis
公共列表<NDT_Equipment> GetALLRecords() { 使用(NDT_DB) { 返回(from a in NDT_DB.NDTEquipment select a); } }
  • 使用DBLINQ ...
  • 我无法编译它...我得到了"你是否缺少一个强制转换"的错误提示。
- Dennis
公共列表<NDT_Equipment> GetALLRecods() { 使用(NDT_DB) { 返回(from a in NDT_DB.NDT_Equipments 选择a) } }
  • 无法编译此代码..出现“是否缺少转换”的错误
  • NDT_DB是自动生成的类
  • NDT_Equipment是NDT_DB内部的一个部分类
- Dennis
我建议你编辑原帖以添加问题的这一额外部分。在那里,你可以更好地格式化它,而且每个人都能看到它。无论如何,看起来你正在尝试将查询作为列表返回。你需要先在查询上调用 "ToList()"。 - Chris Pitman

2

默认情况下,Linq to SQL设计器将为数据库中的每个表创建一个类。所创建的数据库上下文对象将为数据库中的每个表都有一个定义。您可以对这些表定义执行 Linq 查询,并将结果存储在生成的类中,您可以让查询生成匿名类型。这取决于您。


你可以对这些表定义执行Linq查询,并将结果存储在生成的类中。通过这句话,你是指在我的数据库上下文中自动生成的具有表结构定义的类吗? - Dennis
L2S生成的类不会存储在数据上下文中,它们都存储在一个单独的.cs文件中。该文件的名称是您的DBML文件名 + ".designer.cs"。 - Randy Minder

1
根据您问题的标题,我会说不需要。有些情况下,您可能有一些表不需要映射到Linq2SQL中。一个即时的例子是,如果您正在使用ASP.NET会员API,则不需要将那些表/存储过程/函数拖入设计器,因为该数据由API公开。
如果您正在使用设计器(DBML文件),则可以选择要将哪些数据库对象引入到解决方案中。这是我所做的方式,只引入我实际需要访问的db对象。作为另一个例子,我曾经在一个店里工作,他们强烈坚持所有的db访问都通过存储过程完成。因此,在这种情况下,我处理了很多[StoredProcedureName]Results,然后将其映射到其他对象,而不是实际的表本身,甚至没有在解决方案中定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接