c# - 在 EF 4 中,您更喜欢 ObjectSet 还是 CreateQuery?

标签 c# visual-studio-2010 entity-framework entity-framework-4 linq-to-entities

我一直在下面编码。但我找到了另一种方法 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/

相关文章:

c# - 在 Entity Framework 中关闭事务

c# - 为什么 .NET ObservableCollection<T> 实现为类而不是接口(interface)?

c# - 如何解决 C# 应用程序中的 FTP 超时

c# - 从 Excel 电子表格读取数据 - 无法对空引用执行运行时绑定(bind)

visual-studio-2010 - 在远程测试 Controller /代理上运行一项测试

c# - 复杂类型需要主键

c# - 减少 Entity Framework 库对 app.config 的依赖

c# - 如何简化行进方 block 网格?

c# - 为简单的 Person 类实现 iNotifyPropertyChanged 会导致 VisualStudio XAML 设计器崩溃

visual-studio-2010 - 如何使用 PowerShell 编辑 .csproj 文件 - Visual Studio 2010