LINQ to SQL引擎盖下

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以及如何优化它.

Cyr*_*don 6

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)