我是实体框架(EF)和LINQ的新手。
我的问题有点冗长,但非常简单。如果我创建一个查询以使用LINQ从我的RDBMS检索数据,请说:
using (MyEntities myEntities = new MyEntities())
{
// ...
var query = from rec in myEntities.SomeTable
where rec.Id == someId
select rec;
// ...
}
当最终执行时,这实际上是转换为SQL并在数据库本身上执行(无论该机器在哪里),或者是实际先检索到主机上的基础记录,然后由正在运行的应用程序本身进行过滤(使用一些LINQ)和/或EF魔术)。
IOW,将上面“SomeTable”中的所有记录从底层数据库中检索到主机上,然后LINQ和/或EF负责使用给定的“someId”查找记录,或者是上面的查询转换为实际的SQL语句并在数据库机器上执行(然后返回给定的记录)。
我认为它是后者(否则会非常低效),但有人可以证实这一点。此外,无论LINQ查询有多复杂(因为它可能包含复杂的连接等),这是否适用,但不包括当然可以在查询中调用的任何本地函数。
我只是试图从概念上理解底层会发生什么,以及LINQ是否可以有效地用作传统SQL文本查询的高级替代品(即,LINQ在幕后创建实际的SQL查询并发送它们关闭到DB执行,但不参与实际执行本身,除了在查询中处理本地函数调用,如果有的话)。提前谢谢。
答案 0 :(得分:3)
在后台生成一个SQL查询。它可能与仅获取相关数据所需的一样复杂。
如果由于数据库不支持某些LINQ功能而无法生成查询,则不会编译整个表达式(对于sql)。如果要获取所有数据,然后在客户端以复杂的方式进行过滤,则可以手动覆盖此行为。为此,您可以在LINQ查询的某个早期点放置.ToList()
或.ToArray()
,然后继续where
该列表。
更多阅读:LINQ to SQL Queries。