C# 您更喜欢EF4中的ObjectSet还是CreateQuery?
我一直在下面编码。但我找到了另一种方法和部分。哪一个比另一个好。有什么区别?哪一个性能比另一个好C# 您更喜欢EF4中的ObjectSet还是CreateQuery?,c#,visual-studio-2010,entity-framework,entity-framework-4,linq-to-entities,C#,Visual Studio 2010,Entity Framework,Entity Framework 4,Linq To Entities,我一直在下面编码。但我找到了另一种方法和部分。哪一个比另一个好。有什么区别?哪一个性能比另一个好 public T Single(Func<T, bool> predicate) { return _context.CreateQuery<T>("[" + typeof(T).Name + "]").Where(predicate).Single(); } public T Single(Func谓词) { 返回_context.CreateQuery(“[”+
public T Single(Func<T, bool> predicate)
{
return _context.CreateQuery<T>("[" + typeof(T).Name + "]").Where(predicate).Single();
}
public T Single(Func谓词)
{
返回_context.CreateQuery(“[”+typeof(T).Name+“]”)。其中(谓词).Single();
}
另一种用法
public T Single(Func<T, bool> predicate)
{
return _objectSet.Single<T>(predicate);
}
public T Single(Func谓词)
{
返回_objectSet.Single(谓词);
}
哪个更喜欢?我更喜欢使用
IObjectSet
,因为您可以创建一个实现单元测试的IObjectSet
的伪对象。有关这方面的讨论,请参见和。它们是完全不同的事物,具有完全不同的目的
ObjectSet
是一个强类型属性,允许您对概念模型运行LINQ查询。(ctx.Apples.Where(x=>x.Color==“红色”)
)
CreateQuery
是一种允许您针对物理模型运行原生SQL的方法。也称为EntitySQL。(从dbo.Apples WHERE Color=“Red”
中选择*)
ObjectSet
更安全,因为模型上的实体作为ObjectSet上的属性公开,而ObjectSet是通过泛型键入的<另一方面,code>CreateQuery也被键入实体,但实际的查询是EntitySQL,一个字符串参数,这意味着可能会因为键入错误而发生运行时错误。使用ObjectSet
时,您将遇到的唯一运行时错误是特定于CLR的错误(空引用等)或特定于SQL的错误(外键约束、PK冲突等)
正如@adrift还提到的,IObjectSet
是可模拟的,但是您当然可以为CreateQuery
创建一个代理/包装类并模拟它
在过去的几个月里,我一直在使用Entity Framework 4.0,但没有发现
CreateQuery
的任何用法。我要么使用ObjectSet
要么使用存储过程。在帖子中不需要HTML格式-看到了吗?你担心性能吗?第一位代码甚至不能可靠地工作!