实体框架字符串vs lambda ...缺少.Execute

时间:2013-08-26 14:36:17

标签: c# .net entity-framework entity-framework-4

我正在使用实体框架,我想执行一个查询,并想知道哪个是执行查询的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不可用?它看起来很红。

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

带有lambda的

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

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

Execute不可用的原因是因为带有lambda参数的IncludeIQueryable<T>上的一个扩展方法,它返回IQueryable<T>以便链接{{1}等方法1}}。带有字符串参数的WhereInclude上返回ObjectQuery<T>的方法。 ObjectQuery<T>Execute上的方法,而不是ObjectQuery<T>,因此当您使用IQueryable<T>方法时,它不可用。