【发布时间】:2012-05-09 22:55:50
【问题描述】:
好的,所以我再次测试 EF 的性能,我只想从我的数据库中返回一个简单的结果。
例子
var jobsList = from j in mf.Jobs
where j.UserID == 1001 select new { Job = j };
不幸的是,这将我的用户对象加入了这个列表,我不希望 EF 这样做。我如何告诉EF不要仅仅因为有关系而加入。基本上我只想要该表中的一个简单行。
或者我是否需要使用不同类型的检索。我仍在使用下面的基本类型的数据库检索,我觉得现在有更好的方法来处理数据库工作。
SqlConnection myconnection = new SqlConnection();
编辑
基本上我在更清晰的背景下说的话。是不是只得到以下内容。
Job.JobID
Job.UserID
//Extra properties
我明白了
Job.JobID
Job.UserID
Job.User
//Extra properties
那个用户对象很容易消耗比需要更多的内存,而且我不需要它。
我的解决方案
所以我仍然不太相信 EF,这就是原因。我关闭了 LazyLoading 并将其打开,并没有真正注意到那里的性能差异太大。然后,我将我的 SqlConnection 类型方法使用的数据量与我的 EF 方法进行了比较。
我得到了完全相同的结果集,这是性能差异。
对于我的实体框架方法,我会返回一份工作列表。
MyDataEntities mf = new MyDataEntities(); // 4MB for the connection...really?
mf.ContextOptions.LazyLoadingEnabled = false;
// 9MB for the list below
var test = from j in mf.Jobs
where j.UserID == 1031
select j;
foreach (Job job in test) {
Console.WriteLine(job.JobID);
}
对于执行存储过程并返回结果集的我的 SqlConnection 方法。
//356 KB for the connection and the EXACT same list.
List<MyCustomDataSource.Jobs> myJobs = MyCustomDataSource.Jobs.GetJobs(1031);
我完全理解 Entity Framework 比标准 SqlConnection 做得更多,但如果它要为结果集占用至少 25 倍以上的内存,为什么还要大肆宣传呢?只是看起来不值得。
毕竟我的解决方案是不要使用 EF。
【问题讨论】:
-
生成的SQL是什么样子的?
-
是否启用了延迟加载?如果不是,则加入可能是因为您正在急切加载 User 属性。
-
“不幸的是,这会将我的用户对象加入此列表”是什么意思?
-
为什么会有join?
UserID不只是Jobs表中的一个外键列,SQL 对这个列有一个简单的 WHERE 子句吗? -
@w.brian 我不确定什么是延迟加载。我会对此进行更多研究。
标签: c# sql entity-framework-4