gpt4 book ai didi

c# - 底层的 LINQ to SQL

转载 作者:行者123 更新时间:2023-11-30 13:37:58 26 4
gpt4 key购买 nike

我知道之前有人问过这个问题,但没有一个问题能完全回答这个问题。

当使用 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);

然后,稍后,如果我尝试访问某些用户的某些属性,将如何构造查询(这部分回答了 here)?

var temp = users.ToList()[0].SomeProperty;

基本上,我真正想知道的是 LINQ to SQL 在底层是如何工作的,它是如何从 C# 语言语句到 SQL 的,以及它是如何优化的。

最佳答案

LINQ to SQL 框架将把你的 Linq 查询,实际上是一个表达式树,然后将这个表达式树转换成一个纯 SQL 查询。参见 How to: Use Expression Trees to Build Dynamic Queries

事实上,每个表达式树都可以翻译成您需要的任何语言或数据库。您将有不同的提供商为不同的数据库( OracleSQLite 等)实现 IQueryable。请注意,LINQ to SQL 是 LINQ to SQL Server 的缩写。另一方面,Entity framework/LINQ to Entities 可以更容易地扩展到其他数据库。

这里的要点是IQueryable接口(interface),其中包含一个表达式树,以及提供程序的实现。有关如何实现提供程序的示例,即如何将表达式树转换为查询,请参阅 LINQ: Building an IQueryable Provider

这是一个snippet这将使您了解幕后发生的事情:

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");
}
}
}

关于c# - 底层的 LINQ to SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com