我正在比较EF和类型化数据集的有用性。如果EF仅绑定到SQL Server,我无法理解为什么要使用EF over typed数据集。但是,如果你做了类似的事情,那么EF中的Linq语句是否真的被评估是真的:
db.Customers.where(c => c.Name == "John Smith")
EF会建立一个类似的查询:
select * from Customers where Name = 'John smith'
但是对于Typed数据集,你可以写:
bll.GetCustomers().where(c => c.Name == "John Smith")
这是非常相似但不同之处在于第一次运行:
select * from Customers
然后使用标准集合库查找包含名称的行:“John Smith”。理论上意味着EF会更有效率。
这是对的吗?
答案 0 :(得分:4)
是。使用实体框架,它使用IQueryable<T>
来构建您的查询。通过做:
var results = db.Customers.Where(c => c.Name == "John Smith");
在内部,结果将为IQueryable<Customer>
(或您的类型)。这允许提供者(EF)优化内部执行的方式。对于SQL Server,发送到服务器的实际查询已经具有SQL WHERE子句,这反过来意味着您将仅从DB返回单个记录(如果“Name”是唯一的)每条记录。
使用类型化数据集,您将返回每条记录,然后在结果中搜索相应的名称。这可能效率低得多。
答案 1 :(得分:2)
这是正确的。实体框架是一个对象关系映射器(ORM)。它提供了一种将对象映射到关系数据以进行查询的方法。 IQueryable<T>
与EF一起使用,基本上可以优化发送到服务器和从服务器发送的SQL。
答案 2 :(得分:1)
不,这不对。使用类型化数据集,您可以向tableadapter添加参数查询,例如'SELECT * from Customers where name = @name' 您将在运行时从代码中提供name参数。这样,您只需将所需数据提取到数据集中。按照Reed的回复首先拉出整个表格,效率极低,而且对于任何大小的数据库都不太现实。 这似乎是对ADO.Net的一种常见误解,即使在某些书籍中也是如此 - 特别是关于实体框架的书籍!