我在用什么?(Linq/sql)

本文关键字:Linq sql 什么 | 更新日期: 2023-09-27 17:50:55

我的项目目前使用"linq"的以下语法

 var le = domainModel.EntityDataContext.Table_name_here.Query()
                    .WithFullReadCheck(domainModel.Security)
                    .Where(x => x.Metadata.AdvisorID == advisorId).FirstOrDefault();

据说上面的代码是linq,由于不知道linq,我决定学习它。然而https://msdn.microsoft.com/en-us/library/gg509017.aspx,情况大不相同。

我的代码中使用了什么?这是linq的一个版本吗?是别的东西吗?

我在用什么?(Linq/sql)

您使用的是LINQ。有两种不同的符号可以用于编写LINQ-Lambda语法查询语法

区别在这里解释:LINQ:点符号与查询表达式

MSDN上有更多关于这方面的信息:https://msdn.microsoft.com/en-us/library/bb308959.aspx

MSDN的文章从用类似SQL的语法("查询语法"(解释LINQ开始,然后解释Lambda表达式和表达式树("lamba语法"(。

这是查询的扩展方法语法。.Query().WithFullReadCheck()不太常见,但其余的.Where.FirstOrDefault是非常常见的查询扩展。LINQ是一种特殊语法,用于表达与链接查询扩展方法相同的内容。在幕后,他们是一模一样的。

请参阅这个问题,它给出了LINQ和扩展方法语法的示例,并很好地讨论了它们之间的差异:扩展方法语法与查询语法

Linq(语言集成查询(是用于查询数据的语言。你不在乎它们来自哪里,这就是使用它的全部意义。你可以使用相同的代码来查询数组、集合、数据库、xml文件、目录等等。。。Linq在后台翻译您的代码,因此,例如,如果您使用它从数据库中获取数据,它会生成要发送到数据库的SQL。

有两个可用的语法版本:

1.(lambda语法
2.(可链接方法

你选择哪一个并不重要,只要试着与之保持一致,并在你的情况下使用让你更舒服/更有意义的东西。

LINQ是"语言集成查询"。实际上,它对大多数人来说意味着两件事:

编译器将内联委托转换为表达式树的方式,而不是匿名方法。这意味着x => x.Metadata.AdvisorID == advisorId在编译时不会编译到IL中:相反,它会编译到构建等效Expression对象的代码中,该对象可以传递给实体框架或LINQ to SQL等提供程序,以便生成数据库查询。

对大多数人来说,它意味着所谓的"句法糖",它实际上代表你调用.Where().OrderBy()等:

from a in something
where a.Name == "Bob"
select a;

在这两种情况下,.NET中的Queryable类都提供了用于构建Expression对象链的扩展方法,例如.Where().OrderBy().Select()等,它们接受一个IQueryable(非类型化或带有泛型参数(并返回另一个。它们在每个点上轻轻地包装一个Expression对象,该对象表示整个查询。

含义:

someQueryable.Where(x => x.Id > 3).OrderBy(x => x.Date).Select(x => x.Ref)

返回一个实现IQueryable的对象,该对象包含一个Expression,看起来像:

Select(OrderBy(Where(someQueryable, x => x.Id > 3), x => x.Date), x => x.Ref)

它可由LINQ提供商读取,以产生类似的内容

SELECT Ref FROM someTable WHERE Id > 3 ORDER BY Date

最后,请注意,.Where().OrderBy()等不限于可查询/LINQ对象。它们也存在于IEnumerable(和IEnumerable<>(中,但这不是LINQ,只是在调用方法时执行操作。