实体框架和linq之间的混淆

本文关键字:之间 linq 框架 实体 | 更新日期: 2023-09-27 18:22:14

我想知道以下代码被视为实体框架或linq或其他什么。

var model = _db.Restaurants
               .OrderByDescending(r => r.Address.City)
               .Where(r => r.Address.State == state || (state == null));  

我认为它是linq,因为它使用System.linq命名空间。然而,就我而言,linq是这样写的:

var waCustomers = 
        from c in customers 
        where c.Region == "WA" 
        select c; 

如果有人能澄清我的困惑,我将不胜感激。

实体框架和linq之间的混淆

LINQ有两种语法-查询语法,它看起来像声明性查询,并使用集成到语言中的关键字:

var query = from x in something
            where x.Foo == 42
            select x.Bar;

命令式方法语法,它基于您提供的常用方法。方法语法中的相同查询将如下所示:

var query = something.Where(x => x.Foo == 42).Select(x => x.Bar);

您应该知道的是,这两个查询之间没有区别。事实上,在编译过程中,任何用查询语法编写的查询都会被翻译成方法语法询语法视为语法糖。

我个人更喜欢可读性强、干净的声明性查询,但它们在方法语法查询中可用的功能子集有限。

建议阅读:LINQ(C#)中的查询语法和方法语法

PS实体框架使用LINQ到实体查询,这些查询被转换为SQL查询。与任何其他LINQ查询一样,您可以用任何您喜欢的语法编写它们。

您可以用两种方式编写语言集成查询。

1. Query Syntax
   var result = from customer in Customer
                where customer.FirstName == "Mukund"
                select customer;
2. Method Syntax
   var result = Customer.Where( c => c.FirstName == "Mukund");

以上两个查询都将给出相同的记录。

根据MSDN

介绍性语言集成查询(LINQ)文档中的大多数查询都是使用LINQ声明性查询语法编写的。但是,在编译代码时,必须将查询语法转换为.NET公共语言运行时(CLR)的方法调用。这些方法调用调用标准查询运算符,这些运算符的名称如WhereSelectGroupByJoin以及Average。您可以使用方法语法而不是查询语法直接调用它们。

LINQ是System.LINQ命名空间中方法的集合。它分为两半,Enumerable类和Queryable类。

Enumerable半部分是用于操作对象的内存序列的方法的集合。

Queryable的一半是一个框架。它提供了一组方法,可以创建表示所使用的各种查询方法的对象。这些方法可以在实现IQueryable的任何类型上调用,并且表示查询的对象被传递给该对象。LINQ本身实际上并没有提供各种实现(除了允许在内存序列中使用IQueryable方法的实现),它只提供了一个定义查询的标准化方法框架。

接下来是一大堆不同的"查询提供者"。这就是Entity Framework。它是IQueryable的一个实现,能够接受来自LINQ方法的有关查询的信息,并实际使用这些信息做一些事情;在这种情况下,对数据库执行查询。它与LINQ是分开的,而不是它的一部分,但LINQ使用它来实际实现执行查询的实际目标。除了EF之外,还有许多其他类型的查询提供程序能够使用LINQ提供的标准化查询信息做各种不同的事情。

至于不同的语法,这是一个独立的语言功能,它也与LINQ分离(尽管与LINQ相关)。它是一个被称为"查询语法"的C#特性。它是一种将您提供的代码转换为一系列方法调用的语言功能。where关键字映射到一个Where方法调用,Select关键字映射到Select方法调用,等等。你可以看到语言规范来详细解释任何给定的查询语法查询映射到什么。这个语法创建的所有各种方法碰巧也由LINQ实现,这使得这个语言功能与LINQ非常密切相关,和通常仅与LINQ一起使用,尽管从技术上讲它不是LINQ本身的一部分。

Entity Framework是一个ORM(对象到关系映射器),它允许您将存储在关系数据库中的记录映射到对象并返回。

LINQ是一种语言集成查询,它允许为CLR对象的集合编写类似SQL的查询,并可以轻松地对其进行操作。

但这两者的结合非常紧密,不容易看到一条线将两者分开。