1

我将实体框架和 SQL Server 2008 与数据库优先方法一起使用。

我的问题是:

我有一些包含很多列(~100)的表,当我尝试检索很多行时,它需要很长时间才能返回结果,即使有时我只需要使用该表中的 3 或 4 列.

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

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

我的问题又是:

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

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

有没有办法在实体框架中以某种方式做到这一点?这可能吗!

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

4

3 回答 3

5

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

var query  = from t in db.Table
             select new { t.Column1, t.Column2, t.Column3 };
于 2013-03-08T15:43:21.370 回答
1

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

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

我希望它只能阅读 2 列。

对于像 dapper 这样的工具:因为你控制 SQL,只指定你想要的列 - 不要使用*

于 2013-03-08T15:45:39.127 回答
-1

您可以使用代码优先的 DbContext、POCO 和返回所需列子集的映射创建第二个项目。

这是一个剪切和粘贴代码的例子,但它会给你你需要的东西。

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

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

于 2013-03-08T15:42:01.170 回答