LINQ查询语法来自哪里?

时间:2015-05-08 12:40:49

标签: c# asp.net asp.net-mvc linq

我是C#的新手,刚刚开始深入研究使用本质上镜像数据库的类。我感到困惑的是我如何能够使用像

这样的行
var queryLondonCustomers = from cust in customers
                           where cust.City == "London" 
                           select cust;

在我的程序中。根据我的理解,该语法不是正常的#34; C#,所以如果我没有包含System.Linq,上述行就没有任何意义。发生的事情是我们在此文件的上下文中添加了C#sharp语言。

也许我完全错了。有人可以为我清除这个吗?我来自C ++背景,所以也许我会理解是否有人可以向我展示这个概念的C ++等价物。

如果我说对了,为什么这种做事方式比使用C#类通过使用数据库查询的字符串(如PHP和MySQL)与数据库进行对话更为可取?我认为这种与数据库交谈的MVC方式应该为我提供了一个使用C#类进行数据库操作的抽象,但实际上这只是采用数据库语言并在特定C#文件的上下文中将其添加到C#语言中。我无法理解这一点。我不是在拖拽,只是试图理解整个ASP.NET MVC的精神,这是我迄今为止学到的最令人困惑的事情。

4 个答案:

答案 0 :(得分:3)

  

据我所知,该语法不是“正常”C#

是的,从C#3开始。

  

所以如果我没有包含System.Linq

,上面的行就没有任何意义了

是的。它仍然会被编译器有效地转换为:

var queryLondonCustomers = customers.Where(cust => cust.City == "London");

(缺少Select调用是因为您直接选择范围变量,而不是对其进行一些投影。)

如果该代码已编译(例如由于Where中的customers成员,或者由于其类型上的其他扩展方法),那么查询表达式也将如此。

查询表达式在C#语言规范的第7.16节中指定。

关于为什么你想要这样做的问题,好吧:

  • 使用ORM而不仅仅是手动SQL几乎不是新的 - 但是LINQ将它集成到语言中,抽象有点漏洞
  • LINQ不只适用于数据库;我主要在“常规”集合中使用它,例如列表等。

答案 1 :(得分:3)

  

在我的程序中。据我所知,该语法不是“普通”C#,所以如果我没有包含System.Linq,上面的行就没有任何意义

是和否同时: - )

LINQ语法标准C#语法(来自C#3),但它在编译时作为半文本替换解析...

您的代码更改为:

var queryLondonCustomers = customers.Where(cust => cust.City == "London");

然后解决了各种.Where.Select方法(称为Duck Typing ...请参阅示例Does LINQ "Query Syntax" Support Duck Typing?

因此,此时您需要使用using System.Linq来访问System.Linq.EnumerableSystem.Linq.Queryable,它们是实现所有.Where和{{{{}}的两个类。 1}}方法作为扩展方法。

请注意,您可以创建并实现您的静态类.Select,并通过在该类中创建具有“正确”签名的方法,您可以对您的public static class MyLinqMethods类使用LINQ语法

  

如果我是对的,为什么这种做事方式比使用C#类通过使用数据库查询字符串与数据库进行对话更为可取

使用LINQ有一定的安全性...如果您在某处创建了一些映射数据库表的类,那么C#编译器可以检查这些类是否使用了正确的字段名称。如果你写了

MyLinqMethods

编译器会给您一个错误,因为var queryLondonCustomers = from cust in customers where cust.CityERROR == "London" select cust; 不是CityERROR的字段/属性。很明显,你可能在“映射”文件中出错,但至少你有一个地方可能有这些错误。

答案 2 :(得分:1)

  

根据我的理解,该语法不是正常的" C#,

是的。

  

所以如果我没有包含System.Linq

,那么上述行就没有任何意义

会的。它总是意味着同样的事情:

var queryLondonCustomers = customers.Where(cust.City == "London");

C#并不关心customers.Where(Func<Customer, bool>)的定义方式,只要它是这样。 System.Linq具有为WhereIEnumerable定义IQueryable的扩展方法,这些方法覆盖了您想要的99.9%的时间,但它并非必须来自那里。

特别是如果customers是具有自己的Where(Func<Customer, bool>)方法的类的实例,那么它将是使用的重载(实例方法总是在重载决策中击败扩展方法)。同样,如果另一个静态类定义了... Where(this CustomerCollection, Func<Customer, bool>)或类似的扩展方法,则会调用它。

  

如果我说得对,为什么这种做事方式比使用C#类通过使用数据库查询字符串与数据库进行对话更为可取

查询类似集合的对象是一种非常常见的用例,其中数据库访问只有一种。为常见用例提供通用接口是任何基于接口的编程的经典原因。

答案 3 :(得分:0)

ASP.NET MVC只是一种创建Web应用程序的方式,就像您创建Windows窗体或WPF项目来创建桌面应用程序一样。他们没有任何关于数据库交互的特殊功能。

另一方面,LINQ是非常独特的。它提供了一种使用集合的便捷方式。这些集合中的数据可以来自数据库,但并非必须如此。如何编写查询取决于您的偏好。我喜欢lambda语法,它简短易读。

LINQ的优点是您可以使用其语法与数据库进行交互,但因此您需要使用旨在实现此目的的API,例如实体框架。这样,您可以告诉实体框架使用LINQ命令执行某些操作,例如使用某个where子句检索记录。