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

时间:2010-12-14 15:56:11

标签: 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<T, bool> predicate)
{
    return _objectSet.Single<T>(predicate);
}

哪一个比其他人更喜欢?

2 个答案:

答案 0 :(得分: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>,要么使用存储过程。

答案 1 :(得分:0)

我更喜欢使用IObjectSet,因为你可以创建一个伪造,用于单元测试IObjectSet<TEntity>。有关此问题的讨论,请参阅this threadthis post

相关问题