我使用Entity Framework和SQL Server 2008使用Database First方法。
我的问题是:
我有一些表包含许多列(~100),当我尝试检索很多行时,它会在返回结果之前花费很长时间,即使有时我只需要使用3或4列从那张桌子。
我在Stackoverflow中度过了半天试图找到解决这个问题的方法,我想出了两个解决方案:
我的问题是:
如果我使用存储过程来检索包含我想要的列的数据,Entity Framework会使它失去优势,我可以使用ADO.NET代替它并直接调用存储过程......
我不能采取第二种解决方案,因为每次我在数据库中进行更改时,我都不得不重新生成.edmx文件并且我放弃了之前所做的更改:'(
有没有办法在Entity Framework中以某种方式执行此操作? 可能吗!
我知道其他ORM存在,如NHibernate或Dapper,但我不知道他们是否可以提供此功能而不会造成太多痛苦。
答案 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这样的工具:既然你控制了SQL,只需指定你想要的列 - 不要使用*
答案 2 :(得分:-1)
您可以创建第二个项目,其中包含代码优先的DbContext,POCO和返回所需列的子集的映射。
这是剪切和粘贴代码的一种情况,但它可以满足您的需求。
您可以创建类并将数据投影到它们中,但我不确定您是否可以使用此方法进行更新。您可以在单个方法中使用匿名类型,但是您需要在方法之间传递实际类。
另一种选择是转向代码优先开发。