使用ORM检索一些列

时间:2013-03-08 15:37:28

标签: c# .net entity-framework

我使用Entity Framework和SQL Server 2008使用Database First方法。

我的问题是:

我有一些表包含许多列(~100),当我尝试检索很多行时,它会在返回结果之前花费很长时间,即使有时我只需要使用3或4列从那张桌子。

我在Stackoverflow中度过了半天试图找到解决这个问题的方法,我想出了两个解决方案:

  • 使用存储过程检索包含我想要的列的数据。
  • 编辑.edmx(xml)和.cs文件以删除我不会使用的列。

我的问题是:

  • 如果我使用存储过程来检索包含我想要的列的数据,Entity Framework会使它失去优势,我可以使用ADO.NET代替它并直接调用存储过程......

  • 我不能采取第二种解决方案,因为每次我在数据库中进行更改时,我都不得不重新生成.edmx文件并且我放弃了之前所做的更改:'(

有没有办法在Entity Framework中以某种方式执行此操作? 可能吗

我知道其他ORM存在,如NHibernateDapper,但我不知道他们是否可以提供此功能而不会造成太多痛苦。

3 个答案:

答案 0 :(得分:5)

您不必每次都返回每一列。您可以指定所需的列。

var query  = from t in db.Table
             select new { t.Column1, t.Column2, t.Column3 };

答案 1 :(得分:1)

通常,如果您将数据投影到不同的poco中,它将在EF / L2S等中自动执行此操作:

var slim = from row in db.Customers 
           select new CustomerViewModel {
             Name = row.Name, Id = row.Id };

我希望只阅读2列。

对于像dapper这样的工具:既然你控制了S​​QL,只需指定你想要的列 - 不要使用*

答案 2 :(得分:-1)

您可以创建第二个项目,其中包含代码优先的DbContext,POCO和返回所需列的子集的映射。

这是剪切和粘贴代码的一种情况,但它可以满足您的需求。

您可以创建类并将数据投影到它们中,但我不确定您是否可以使用此方法进行更新。您可以在单个方法中使用匿名类型,但是您需要在方法之间传递实际类。

另一种选择是转向代码优先开发。