我正在使用实体框架,我想执行一个查询,并想知道哪个是执行查询的besr方式。这是最佳实践,为什么,以及哪一个更具代表性。
选项1)
return
this.Storage.Customer.OfType<Preferred>()
.Include("Order")
.Where("it.Id = @customerId AND it.CustomerType = @cusType", new ObjectParameter("customerId ", customerId), new ObjectParameter("cusType", (int)cusType))
.Execute(MergeOption.OverwriteChanges)
.SingleOrDefault();
OR
return
this.Storage.Customer.OfType<Preferred>()
.Include(b => b.Order)
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType)
.SingleOrDefault();
第二个问题是为什么在选项2中我们的.Execute不可用?它看起来很红。
提前致谢。
答案 0 :(得分:1)
与实际数据访问相比,性能差异应该可以忽略不计,但您需要测量它以确定。
带有lambda的 Include
只使用反射获取属性名称,然后使用字符串参数调用版本,因此唯一的开销就是解析表达式。 (但这是一个实现细节,因此可能会发生变化)
使用lambda的好处是类型安全 - 在lambda中使用错误的属性名称会破坏构建,但使用错误的字符串只会在运行时失败。
Execute
不可用的原因是因为带有lambda参数的Include
是IQueryable<T>
上的一个扩展方法,它返回IQueryable<T>
以便链接{{1}等方法1}}。带有字符串参数的Where
是Include
上返回ObjectQuery<T>
的方法。 ObjectQuery<T>
是Execute
上的方法,而不是ObjectQuery<T>
,因此当您使用IQueryable<T>
方法时,它不可用。