大多数应用程序都以数据为中心,但是大多数数据存储库都是关系数据库。多年来,设计人员和开发人员已经基于对象模型设计了应用程序。 这些对象负责连接到数据访问组件-称为数据访问层(DAL)。这里我们要考虑三点:
因此,如果有一种工具可以使所有类型的数据访问变得容易,并且可以用几行代码合并来自这些不同数据源的数据并执行标准的数据处理操作,那么它将很有帮助。 LINQ或语言集成查询就是这样的工具。LINQ是.Net Framework 3.5及其托管语言的扩展集,这些扩展将查询设置为对象。它定义了通用语法和编程模型,以使用通用语言查询不同类型的数据。 关系运算符,例如Select,Project,Join,Group,Partition,Set操作等,都在LINQ中实现,而.Net Framework 3.5中的C#和VB编译器支持LINQ语法,使得可以使用配置的数据存储而无需诉诸ADO.NET。 例如,使用C#中的LINQ查询在Northwind数据库中查询“客户”表,代码将是: var data = from c in dataContext.Customers where c.Country == "Spain" select c; 哪里:
LINQ查询可以应用于从IEnumerable <T>继承的任何数据承载类,这里T是任何数据类型,例如List <Book>。 让我们看一个例子来理解这个概念。该示例使用以下类:Books.cs public class Books { public string ID {get; set;} public string Title { get; set; } public decimal Price { get; set; } public DateTime DateOfRelease { get; set; } public static List<Books> GetBooks() { List<Books> list = new List<Books>(); list.Add(new Books { ID = "001", Title = "Programming in C#", Price = 634.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Title = "Learn Java in 30 days", Price = 250.76m, DateOfRelease = Convert.ToDateTime("2011-08-15") }); list.Add(new Books { ID = "003", Title = "Programming in ASP.Net 4.0", Price = 700.00m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); list.Add(new Books { ID = "004", Title = "VB.Net Made Easy", Price = 500.99m, DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005", Title = "Programming in C", Price = 314.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "006", Title = "Programming in C++", Price = 456.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007", Title = "Datebase Developement", Price = 1000.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); return list; } } 使用此类的网页上有一个简单的标签控件,可显示书籍的标题。Page_Load事件创建书籍列表,并使用LINQ查询返回书名: public partial class simplequery : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List<Books> books = Books.GetBooks(); var booktitles = from b in books select b.Title; foreach (var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title); } } 执行页面后,标签将显示查询结果: 上面的LINQ表达式: var booktitles = from b in books select b.Title; 等效于以下SQL查询: SELECT Title from Books LINQ运算符除了到目前为止使用的运算符外,还有其他几种运算符可以实现所有查询子句。让我们看一些运算符和子句。 Join子句SQL中的“ join子句”用于联接两个数据表,并显示包含两个表中的列的数据集。LINQ也能够做到这一点。要检查这一点,请在上一个项目中添加另一个名为Saledetails.cs的类: public class Salesdetails { public int sales { get; set; } public int pages { get; set; } public string ID {get; set;} public static IEnumerable<Salesdetails> getsalesdetails() { Salesdetails[] sd = { new Salesdetails { ID = "001", pages=678, sales = 110000}, new Salesdetails { ID = "002", pages=789, sales = 60000}, new Salesdetails { ID = "003", pages=456, sales = 40000}, new Salesdetails { ID = "004", pages=900, sales = 80000}, new Salesdetails { ID = "005", pages=456, sales = 90000}, new Salesdetails { ID = "006", pages=870, sales = 50000}, new Salesdetails { ID = "007", pages=675, sales = 40000}, }; return sd.OfType<Salesdetails>(); } } 将代码添加到Page_Load事件处理程序中,以使用join子句在两个表上进行查询: protected void Page_Load(object sender, EventArgs e) { IEnumerable<Books> books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); var booktitles = from b in books join s in sales on b.ID equals s.ID select new { Name = b.Title, Pages = s.pages }; foreach (var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title); } 结果页面如下所示: Where子句“ where子句”允许向查询添加一些条件过滤器。例如,如果要查看页数超过500的书籍,请将Page_Load事件处理程序更改为: var booktitles = from b in books join s in sales on b.ID equals s.ID where s.pages > 500 select new { Name = b.Title, Pages = s.pages }; 该查询仅返回页面数大于500的那些行: Orderby和Orderby降序条款这些子句允许对查询结果进行排序。要查询书名,页数和价格(按价格排序),请在Page_Load事件处理程序中编写以下代码: var booktitles = from b in books join s in sales on b.ID equals s.ID orderby b.Price select new { Name = b.Title, Pages = s.pages, Price = b.Price}; 返回的元组为: Let子句let子句允许定义变量并为其分配从数据值计算得出的值。例如,要从上述两个销售中计算总销售,您需要计算: TotalSale = Price of the Book * Sales 为此,请在Page_Load事件处理程序中添加以下代码段: let子句允许定义变量并为其分配从数据值计算得出的值。例如,要从上述两个销售中计算总销售,您需要计算: var booktitles = from b in book join s in sales on b.ID equals s.ID let totalprofit = (b.Price * s.sales) select new { Name = b.Title, TotalSale = totalprofit}; 结果查询页面如下所示: |