1

我正在使用实体框架,我想执行查询,并想知道执行查询的最佳方式。哪个是最佳实践,为什么,哪个更好。

选项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 不可用?它显示为红色。

提前致谢。

4

1 回答 1

1

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

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

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

原因Execute不可用是因为Include使用 lambda 参数是一个扩展方法,IQueryable<T>它返回一个IQueryable<T>以便链接方法,如Where. Include带有字符串参数的方法ObjectQuery<T>是返回一个ObjectQuery<T>. Execute是一个方法ObjectQuery<T>,不是,所以当你使用方法IQueryable<T>时它不可用。IQueryable

于 2013-08-26T14:41:55.777 回答