我是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的精神,这是我迄今为止学到的最令人困惑的事情。
答案 0 :(得分:3)
据我所知,该语法不是“正常”C#
是的,从C#3开始。
所以如果我没有包含System.Linq
,上面的行就没有任何意义了
是的。它仍然会被编译器有效地转换为:
var queryLondonCustomers = customers.Where(cust => cust.City == "London");
(缺少Select
调用是因为您直接选择范围变量,而不是对其进行一些投影。)
如果该代码已编译(例如由于Where
中的customers
成员,或者由于其类型上的其他扩展方法),那么查询表达式也将如此。
查询表达式在C#语言规范的第7.16节中指定。
关于为什么你想要这样做的问题,好吧:
答案 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.Enumerable
和System.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
具有为Where
和IEnumerable
定义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子句检索记录。