你更喜欢EF 4中的ObjectSet或CreateQuery?

Pen*_*uen 3 c# linq-to-entities entity-framework visual-studio-2010 entity-framework-4

我一直在下面编码.但我找到了另一种方法.哪一个比其他更优选.差异是什么?一个人比其他人有更多的表现?

public T Single(Func<T, bool> predicate)
{
    return _context.CreateQuery<T>("[" + typeof(T).Name + "]").Where(predicate).Single();
}
Run Code Online (Sandbox Code Playgroud)

另一种用法

public T Single(Func<T, bool> predicate)
{
    return _objectSet.Single<T>(predicate);
}
Run Code Online (Sandbox Code Playgroud)

哪一个比其他人更喜欢?

RPM*_*984 5

它们是完全不同的东西,具有完全不同的目的.

ObjectSet<T>是一个强类型属性,允许您对概念模型运行LINQ查询.().ctx.Apples.Where(x => x.Color == "Red")

CreateQuery<T>是一种允许您针对物理模型运行本机SQL的方法.也称为EntitySQL.()SELECT * FROM dbo.Apples WHERE Color = "Red"

ObjectSet<T>更加类型安全,因为模型上的实体作为ObjectSet上的属性公开,它通过泛型键入.CreateQuery<T>另一方面也是对实体类型,但实际的查询是EntitySQL,一个字符串参数 - 意味着可能由于拼写错误而发生运行时错误.您将获得的唯一运行时错误ObjectSet<T>是CLR特定错误(空引用等)或SQL特定错误(外键约束,PK违规等).

正如@adrift也提到的那样,IObjectSet<T>是可以CreateQuery<T>模仿的,但是当然你可以为它创建一个代理/包装类并进行模拟.

我在过去的几个月里使用过Entity Framework 4.0,并没有找到一个用法CreateQuery<T>.我使用ObjectSet<T>或存储过程.