我正在比较 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 会更高效。
这是正确的吗?
是的。对于实体框架,它使用
IQueryable<T>
来构建查询。通过这样做:
var results = db.Customers.Where(c => c.Name == "John Smith");
在内部,结果将是
IQueryable<Customer>
(或您的类型)。这允许提供者 (EF) 优化其内部执行方式。对于 SQL Server,发送到服务器的实际查询将已经包含 SQL WHERE 子句,这反过来意味着您只会从数据库返回一条记录(如果“Name”是唯一的)每条记录。
使用类型化数据集,您将返回每条记录,然后在结果中搜索适当的名称。这可能效率低得多。
这是正确的。实体框架是一个对象关系映射器(ORM)。它提供了一种将对象映射到关系数据以进行查询的方法。
IQueryable<T>
与EF配合使用,基本上可以优化与服务器之间收发的SQL。
不,这是不正确的。使用类型化数据集,您可以向表适配器添加参数查询,例如“SELECT * from Customers where name = @name” 您可以在运行时从代码中提供名称参数。这样您只需将所需的数据提取到数据集中。按照里德的答复首先提取整个表充其量是非常低效的,并且对于任何大小的数据库都是不现实的。 这似乎是对 ADO.Net 的常见误解,甚至在一些书籍中也存在 - 特别是有关实体框架的书籍!
有多种方法可以有效地使用类型化数据集,参数化您的存储过程,并且最重要的是在存储过程级别使用分页,这会快得多。