有人可以澄清实体框架和类型化数据集之间的主要区别吗?

问题描述 投票:0回答:4

我正在比较 EF 和类型化数据集的有用性。如果 EF 仅绑定到 SQL Server,我不明白为什么要在类型化数据集上使用 EF。但是,如果您执行以下操作,EF 中的 Linq 语句是否会被评估较晚:

db.Customers.where(c => c.Name == "John Smith")

EF 将构建一个如下查询:

select * from Customers where Name = 'John smith'

但是对于类型化数据集,您可以编写:

bll.GetCustomers().where(c => c.Name == "John Smith")

非常相似,但不同之处在于它首先运行:

select * from Customers

然后使用标准集合库查找包含名称“John Smith”的行。理论上意味着 EF 会更高效。

这是正确的吗?

c# entity-framework strongly-typed-dataset
4个回答
4
投票

是的。对于实体框架,它使用

IQueryable<T>
来构建查询。通过这样做:

var results = db.Customers.Where(c => c.Name == "John Smith");

在内部,结果将是

IQueryable<Customer>
(或您的类型)。这允许提供者 (EF) 优化其内部执行方式。对于 SQL Server,发送到服务器的实际查询将已经包含 SQL WHERE 子句,这反过来意味着您只会从数据库返回一条记录(如果“Name”是唯一的)每条记录。

使用类型化数据集,您将返回每条记录,然后在结果中搜索适当的名称。这可能效率低得多。


2
投票

这是正确的。实体框架是一个对象关系映射器(ORM)。它提供了一种将对象映射到关系数据以进行查询的方法。

IQueryable<T>
与EF配合使用,基本上可以优化与服务器之间收发的SQL。


1
投票

不,这是不正确的。使用类型化数据集,您可以向表适配器添加参数查询,例如“SELECT * from Customers where name = @name” 您可以在运行时从代码中提供名称参数。这样您只需将所需的数据提取到数据集中。按照里德的答复首先提取整个表充其量是非常低效的,并且对于任何大小的数据库都是不现实的。 这似乎是对 ADO.Net 的常见误解,甚至在一些书籍中也存在 - 特别是有关实体框架的书籍!


0
投票

有多种方法可以有效地使用类型化数据集,参数化您的存储过程,并且最重要的是在存储过程级别使用分页,这会快得多。

© www.soinside.com 2019 - 2024. All rights reserved.