C# 实体框架字符串与lambda。。。失踪,执行

C# 实体框架字符串与lambda。。。失踪,执行,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,我正在使用实体框架,我想执行一个查询,并想知道执行查询的besr方式。哪一种是最佳实践?为什么?哪一种更符合共振峰 备选方案1) 返回 this.Storage.Customer.of type() .包括(“订单”) .Where(“it.Id=@customerId和it.CustomerType=@cusType”、新对象参数(“customerId”,customerId)、新对象参数(“cusType”,(int)cusType)) .Execute(MergeOption.Overw

我正在使用实体框架,我想执行一个查询,并想知道执行查询的besr方式。哪一种是最佳实践?为什么?哪一种更符合共振峰

备选方案1)

返回
this.Storage.Customer.of type()
.包括(“订单”)
.Where(“it.Id=@customerId和it.CustomerType=@cusType”、新对象参数(“customerId”,customerId)、新对象参数(“cusType”,(int)cusType))
.Execute(MergeOption.OverwriteChanges)
.SingleOrDefault();

返回
this.Storage.Customer.of type()
.包括(b=>b.顺序)
.Where(cust=>cust.Id==customerId&&cust.CustomerType==(int)cusType)
.SingleOrDefault();
第二个问题是为什么在选项2中.Execute不可用?它看起来是红色的


提前感谢。

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

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

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


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

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

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

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


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

您对.Execute有什么答案吗?如果您使用扩展方法,那么在使用Execute时,您可以控制当前上下文的情况,如果您不使用execute,您会期望一些不同的行为吗?我们的一些查询正在使用.Execute(MergeOption.OverwriteChanges)?您可以尝试将其强制转换为
ObjectQuery
以调用
.Execute
,但使用
IQueryable
可能还有另一种方法来实现这一点。这可能是一个很好的后续问题:)你对.Execute有答案吗?如果你使用扩展方法会发生什么?那么,就使用Execute而言,你可以控制当前上下文会发生什么,如果你不使用Execute,你会期望一些不同的行为吗?我们的一些查询正在使用.Execute(MergeOption.OverwriteChanges)?您可以尝试将其强制转换为
ObjectQuery
以调用
.Execute
,但使用
IQueryable
可能还有另一种方法来实现这一点。这可能是一个很好的后续问题:)
        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();