我一直在下面编码。但我找到了另一种方法 secand part 。哪个比另一个更可取。有什么区别?哪个性能比其他性能好?
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);
}
哪个更受欢迎?
最佳答案
它们是完全不同的东西,具有完全不同的目的。
ObjectSet<T>
是一个强类型属性,允许您针对概念 模型运行LINQ 查询。 (ctx.Apples.Where(x => x.Color == "Red")
)。
CreateQuery<T>
是一种允许您针对物理 模型运行 native 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>
创建一个代理/包装类并 mock 它。
过去几个月我一直在使用 Entity Framework 4.0,但没有找到 CreateQuery<T>
的单一用法。 .我要么使用 ObjectSet<T>
或存储过程。
关于c# - 在 EF 4 中,您更喜欢 ObjectSet 还是 CreateQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441098/