实体框架字符串与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..缺少.执行

与实际数据访问相比,的性能差异应该可以忽略不计,但您需要测量它才能确定。

带lambda的Include只使用反射来获取属性名称,然后用字符串参数调用版本,因此唯一的开销是解析表达式。(不过,这是一个实现细节,因此可能会发生更改)

使用lambda的好处是类型安全-在lambda中使用错误的属性名称会破坏构建,但使用错误的字符串只会在运行时失败。

Execute不可用的原因是,带有lambda参数的IncludeIQueryable<T>上的一个扩展方法,它返回一个IQueryable<T>,以便链接像Where这样的方法。带有字符串参数的IncludeObjectQuery<T>上返回ObjectQuery<T>的方法。ExecuteObjectQuery<T>上的方法,而不是IQueryable<T>,因此在使用IQueryable方法时不可用。