实体框架字符串与lambda..缺少.执行
本文关键字:缺少 执行 lambda 框架 字符串 实体 | 更新日期: 2023-09-27 18:29:12
我正在使用实体框架,我想执行查询,并想知道执行查询的最佳方式是哪种。哪一个是最佳实践,为什么,哪一个更符合共振峰。
选项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();
或
return
this.Storage.Customer.OfType<Preferred>()
.Include(b => b.Order)
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType)
.SingleOrDefault();
第二个问题是为什么选项2中的.Execute不可用?它显示为红色。
提前谢谢。
与实际数据访问相比,的性能差异应该可以忽略不计,但您需要测量它才能确定。
带lambda的Include
只使用反射来获取属性名称,然后用字符串参数调用版本,因此唯一的开销是解析表达式。(不过,这是一个实现细节,因此可能会发生更改)
使用lambda的好处是类型安全-在lambda中使用错误的属性名称会破坏构建,但使用错误的字符串只会在运行时失败。
Execute
不可用的原因是,带有lambda参数的Include
是IQueryable<T>
上的一个扩展方法,它返回一个IQueryable<T>
,以便链接像Where
这样的方法。带有字符串参数的Include
是ObjectQuery<T>
上返回ObjectQuery<T>
的方法。Execute
是ObjectQuery<T>
上的方法,而不是IQueryable<T>
,因此在使用IQueryable
方法时不可用。