我一直在编码。但我找到了另一种方法。哪一个比其他更优选。差异是什么?一个人比其他人有更多的表现?
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);
}
哪一个比其他人更喜欢?
答案 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 thread和this post。