2012-05-08 61 views
1

好,所以我再次测试了EF的性能,我只是想从我的数据库返回一个简单的结果。如何让Entity Framework不连接表?

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); 
} 

对于执行Stored Proc并返回结果集的SqlConnection方法。

//356 KB for the connection and the EXACT same list. 
List<MyCustomDataSource.Jobs> myJobs = MyCustomDataSource.Jobs.GetJobs(1031); 

我完全理解实体框架是这样做比标准的SqlConnection方式更多,但为什么这一切炒作,如果它是要采取在对结果集的最小的25X更多的内存。这似乎不值得。

我的解决方案并不是用EF来完成。

+0

生成的SQL看起来像什么? – Magnus

+3

是否启用延迟加载?如果不是,则加入可能是因为您急于加载用户属性。 –

+0

你是什么意思,“不幸的是我加入我的用户对象到这个列表”? – JotaBe

回答

1

User属性是作业类的一部分,但不会加载,直到您访问它(延迟加载)。所以它实际上并没有“加入”。

如果你只想要两个指定列,你可以写

var jobsList = from j in mf.Jobs 
       where j.UserID == 1001 
       select new { 
          Job.JobID, 
          Job.UserID 
          }; 
+0

好吧我认为这是我需要的。基本上,如果我想要返回一个特定的类,只有该类或在这种情况下表,我需要按字段指定我想要的。 – meanbunny

+1

@meanbunny如果你想返回表格作业中的所有值,只需写入......选择作业相关的表格将显示在对象上但不会被加载。 – Magnus

+0

Ahhhh我明白了。经过测试,这非常有意义。 Ty为您提供帮助。 – meanbunny

0

我认为EF不知道你只想要一个结果。尝试这样的事情。

Job jobsItem = mf.Jobs.Single(j=>j.UserID==1001) 

如果你不想使用lambas ...

Job JobItem = (from j in mf.Jobs where j.UserID == 1001 select j).Single() 

我有接近现在不是一个编译器,我希望的语法是正确的。如果你愿意,可以使用var而不是Job作为你的变量。它没有效果,但我认为Job在这种情况下更具可读性。

+0

我认为这里的语法是完美的。然而,检查我的编辑,并看到更多关于我在说什么。起初对不完整的描述感到抱歉。基本上我只想要用户标识返回不是用户标识和用户。 – meanbunny

+0

好的:D我读过你的编辑。那么我认为这完全是关于懒加载的概念。看看它像JotaBe推荐你。 – Jonathan

1

最可能的原因这种现象是,你必须LazyLoadingEnabled property设置为true。

如果是这种情况,用户不会在原始查询中恢复。但是,如果您尝试访问此属性,即使您在调试时通过检查来完成此操作,也会从数据库中加载该属性。但只有当你尝试访问它。

您可以检查此开放的SQL Server Profiler,并查看开始发送到数据库的命令。

您的代码未使用急切加载或显式加载。所以这一定是原因。

0

除非您访问作业的用户属性,否则用户实际上并未附加到上下文。如果您希望为用户获取空值,请关闭延迟加载。

相关问题