我的项目目前使用"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。有两种不同的符号可以用于编写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.(可链接方法
你选择哪一个并不重要,只要试着与之保持一致,并在你的情况下使用让你更舒服/更有意义的东西。
编译器将内联委托转换为表达式树的方式,而不是匿名方法。这意味着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,只是在调用方法时执行操作。