Igo*_*evo 3 c# sql linq performance linq-to-sql
我知道这是之前部分问过,但没有一个问题完全回答这个问题.
当使用LINQ to SQL从数据库中检索数据时会发生什么?
我读过以下问题:
我不清楚的是:访问数据库的时间点是多少?查询何时运行?
如果我运行以下查询,它将如何转换为SQL查询?
DatabaseDataContext db = new DatabaseDataContext();
var users = from x in db.Users
where x.Rank > 10
orderby x.RegistrationDate descending
select x)
.Skip(pageIndex * recordCount)
.Take(recordCount);
Run Code Online (Sandbox Code Playgroud)
再后来,如果我尝试访问某些用户的某些属性,如何查询构造(这部分是回答在这里)?
var temp = users.ToList()[0].SomeProperty;
Run Code Online (Sandbox Code Playgroud)
基本上,我真正想知道的是LINQ to SQL如何在底层工作,如何从C#语言语句到SQL以及如何优化它.
LINQ to SQL框架将采用您的Linq查询(实际上是表达式树),然后将此表达式树转换为纯SQL查询.请参见如何:使用表达式树构建动态查询
实际上,每个表达式树都可以翻译成您需要的任何语言或数据库.您将有不同的提供程序为不同的数据库(Oracle,SQLite等)实现IQueryable .请注意,LINQ to SQL是LINQ to SQL Server的缩写.另一方面,实体框架/ LINQ to Entities可以更容易地用于其他数据库.
这里的要点是IQueryable接口,它包含一个表达式树,以及提供程序的实现.有关如何实现提供程序的示例,即如何从表达式树转换为查询,请参阅LINQ:构建IQueryable提供程序
这是一个片段,可以让您了解幕后发生的事情:
if (select.OrderBy != null && select.OrderBy.Count > 0)
{
this.AppendNewLine(Indentation.Same);
sb.Append("ORDER BY ");
for (int i = 0, n = select.OrderBy.Count; i < n; i++)
{
OrderExpression exp = select.OrderBy[i];
if (i > 0)
{
sb.Append(", ");
}
this.Visit(exp.Expression);
if (exp.OrderType != OrderType.Ascending)
{
sb.Append(" DESC");
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |