溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

LINQ動態(tài)查詢怎么理解

發(fā)布時間:2021-12-01 16:06:11 來源:億速云 閱讀:117 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“LINQ動態(tài)查詢怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“LINQ動態(tài)查詢怎么理解”吧!

LINQ動態(tài)查詢有這樣一個場景:應(yīng)用程序可能會提供一個用戶界面,用戶可以使用該用戶界面指定一個或多個謂詞來篩選數(shù)據(jù)。這種情況在編譯時不知道查詢的細節(jié),LINQ動態(tài)查詢將十分有用。

在LINQ中,Lambda表達式是許多標準查詢運算符的基礎(chǔ),編譯器創(chuàng)建lambda表達式以捕獲基礎(chǔ)查詢方法(例如 Where、Select、Order By、Take While 以及其他方法)中定義的計算。表達式目錄樹用于針對數(shù)據(jù)源的結(jié)構(gòu)化查詢,這些數(shù)據(jù)源實現(xiàn)IQueryable。

例如,LINQ to SQL 提供程序?qū)崿F(xiàn) IQueryable接口,用于查詢關(guān)系數(shù)據(jù)存儲。C#和Visual Basic編譯器會針對此類數(shù)據(jù)源的查詢編譯為代碼,該代碼在運行時將生成一個表達式目錄樹。然后,查詢提供程序可以遍歷表達式目錄樹數(shù)據(jù)結(jié)構(gòu),并將其轉(zhuǎn)換為適合于數(shù)據(jù)源的查詢語言。

表達式目錄樹在LINQ中用于表示分配給類型為Expression的變量的Lambda表達式。還可用于創(chuàng)建動態(tài)LINQ查詢。

System.Linq.Expressions命名空間提供用于手動生成表達式目錄樹的API。Expression類包含創(chuàng)建特定類型的表達式目錄樹節(jié)點的靜態(tài)工廠方法,例如,ParameterExpression(表示一個已命名的參數(shù)表達式)或 MethodCallExpression(表示一個方法調(diào)用)。

編譯器生成的表達式目錄樹的根始終在類型Expression的節(jié)點中,其中TDelegate是包含至多五個輸入?yún)?shù)的任何TDelegate委托;也就是說,其根節(jié)點是表示一個lambda表達式。

下面幾個例子描述如何使用表達式目錄樹來創(chuàng)建動態(tài)LINQ查詢。

1.LINQ動態(tài)查詢之Select

下面例子說明如何使用表達式樹依據(jù) IQueryable 數(shù)據(jù)源構(gòu)造一個動態(tài)查詢,查詢出每個顧客的ContactName,并用GetCommand方法獲取其生成SQL語句。

//依據(jù)IQueryable數(shù)據(jù)源構(gòu)造一個查詢  IQueryable<Customer> custs = db.Customers;  //組建一個表達式樹來創(chuàng)建一個參數(shù)  ParameterExpression param =       Expression.Parameter(typeof(Customer), "c");  //組建表達式樹:c.ContactName  Expression selector = Expression.Property(param,      typeof(Customer).GetProperty("ContactName"));  Expression pred = Expression.Lambda(selector, param);  //組建表達式樹:Select(c=>c.ContactName)  Expression expr = Expression.Call(typeof(Queryable), "Select",      new Type[] { typeof(Customer), typeof(string) },      Expression.Constant(custs), pred);  //使用表達式樹來生成動態(tài)查詢  IQueryable<string> query = db.Customers.AsQueryable()      .Provider.CreateQuery<string>(expr);  //使用GetCommand方法獲取SQL語句  System.Data.Common.DbCommand cmd = db.GetCommand(query);  Console.WriteLine(cmd.CommandText);

生成的SQL語句為:

SELECT [t0].[ContactName] FROM [dbo].[Customers] AS [t0]

2.LINQ動態(tài)查詢之Where

下面一個例子是“搭建”Where用法來動態(tài)查詢城市在倫敦的顧客。

IQueryable<Customer> custs = db.Customers;  //創(chuàng)建一個參數(shù)c  ParameterExpression param =       Expression.Parameter(typeof(Customer), "c");  //c.City=="London"  Expression left = Expression.Property(param,      typeof(Customer).GetProperty("City"));  Expression right = Expression.Constant("London");  Expression filter = Expression.Equal(left, right);  Expression pred = Expression.Lambda(filter, param);  //Where(c=>c.City=="London")  Expression expr = Expression.Call(typeof(Queryable), "Where",      new Type[] { typeof(Customer) },       Expression.Constant(custs), pred);  //生成動態(tài)查詢  IQueryable<Customer> query = db.Customers.AsQueryable()      .Provider.CreateQuery<Customer>(expr);

生成的SQL語句為:

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName],   [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region],   [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]  FROM [dbo].[Customers] AS [t0] WHERE [t0].[City] = @p0  -- @p0: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [London]3.OrderBy

本例既實現(xiàn)排序功能又實現(xiàn)了過濾功能。

IQueryable<Customer> custs = db.Customers;  //創(chuàng)建一個參數(shù)c  ParameterExpression param =     Expression.Parameter(typeof(Customer), "c");  //c.City=="London"  Expression left = Expression.Property(param,      typeof(Customer).GetProperty("City"));  Expression right = Expression.Constant("London");  Expression filter = Expression.Equal(left, right);  Expression pred = Expression.Lambda(filter, param);  //Where(c=>c.City=="London")  MethodCallExpression whereCallExpression = Expression.Call(      typeof(Queryable), "Where",      new Type[] { typeof(Customer) },      Expression.Constant(custs), pred);  //OrderBy(ContactName => ContactName)  MethodCallExpression orderByCallExpression = Expression.Call(      typeof(Queryable), "OrderBy",      new Type[] { typeof(Customer), typeof(string) },       whereCallExpression,      Expression.Lambda(Expression.Property      (param, "ContactName"), param));  //生成動態(tài)查詢  IQueryable<Customer> query = db.Customers.AsQueryable()      .Provider.CreateQuery<Customer>(orderByCallExpression);

生成的SQL語句為:

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName],   [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region],  [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]  FROM [dbo].[Customers] AS [t0] WHERE [t0].[City] = @p0  ORDER BY [t0].[ContactName]  -- @p0: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [London]4.Union

下面的例子使用表達式樹LINQ動態(tài)查詢顧客和雇員同在的城市。

//e.City  IQueryable<Customer> custs = db.Customers;            ParameterExpression param1 =   Expression.Parameter(typeof(Customer), "e");  Expression left1 = Expression.Property(param1,       typeof(Customer).GetProperty("City"));  Expression pred1 = Expression.Lambda(left1, param1);  //c.City  IQueryable<Employee> employees = db.Employees;  ParameterExpression param2 =   Expression.Parameter(typeof(Employee), "c");  Expression left2 = Expression.Property(param2,       typeof(Employee).GetProperty("City"));  Expression pred2 = Expression.Lambda(left2, param2);  //Select(e=>e.City)  Expression expr1 = Expression.Call(typeof(Queryable), "Select",       new Type[] { typeof(Customer), typeof(string) },       Expression.Constant(custs), pred1);  //Select(c=>c.City)  Expression expr2 = Expression.Call(typeof(Queryable), "Select",       new Type[] { typeof(Employee), typeof(string) },       Expression.Constant(employees), pred2);  //生成動態(tài)查詢  IQueryable<string> q1 = db.Customers.AsQueryable()      .Provider.CreateQuery<string>(expr1);  IQueryable<string> q2 = db.Employees.AsQueryable()      .Provider.CreateQuery<string>(expr2);  //并集  var q3 = q1.Union(q2);

生成的SQL語句為:

SELECT [t2].[City]  FROM (      SELECT [t0].[City] FROM [dbo].[Customers] AS [t0]      UNION      SELECT [t1].[City] FROM [dbo].[Employees] AS [t1]      ) AS [t2]ID標識

在前面這一點沒有說到,在這里作為高級特性單獨說下ID標識。

這個例子說明我們存儲一條新的記錄時候,ContactID作為主鍵標識,系統(tǒng)自動分配,標識種子為1,所以每次自動加一。

//ContactID是主鍵ID,插入一條數(shù)據(jù),系統(tǒng)自動分配ID  Contact con = new Contact()  {      CompanyName = "New Era",      Phone = "(123)-456-7890" };  db.Contacts.InsertOnSubmit(con);  db.SubmitChanges();

到此,相信大家對“LINQ動態(tài)查詢怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI