本篇內(nèi)容主要講解“LINQ動態(tài)查詢怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“LINQ動態(tài)查詢怎么理解”吧!
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、永德網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為永德等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
LINQ動態(tài)查詢有這樣一個場景:應(yīng)用程序可能會提供一個用戶界面,用戶可以使用該用戶界面指定一個或多個謂詞來篩選數(shù)據(jù)。這種情況在編譯時不知道查詢的細(xì)節(jié),LINQ動態(tài)查詢將十分有用。
在LINQ中,Lambda表達(dá)式是許多標(biāo)準(zhǔn)查詢運算符的基礎(chǔ),編譯器創(chuàng)建lambda表達(dá)式以捕獲基礎(chǔ)查詢方法(例如 Where、Select、Order By、Take While 以及其他方法)中定義的計算。表達(dá)式目錄樹用于針對數(shù)據(jù)源的結(jié)構(gòu)化查詢,這些數(shù)據(jù)源實現(xiàn)IQueryable
例如,LINQ to SQL 提供程序?qū)崿F(xiàn) IQueryable
表達(dá)式目錄樹在LINQ中用于表示分配給類型為Expression
System.Linq.Expressions命名空間提供用于手動生成表達(dá)式目錄樹的API。Expression類包含創(chuàng)建特定類型的表達(dá)式目錄樹節(jié)點的靜態(tài)工廠方法,例如,ParameterExpression(表示一個已命名的參數(shù)表達(dá)式)或 MethodCallExpression(表示一個方法調(diào)用)。
編譯器生成的表達(dá)式目錄樹的根始終在類型Expression
下面幾個例子描述如何使用表達(dá)式目錄樹來創(chuàng)建動態(tài)LINQ查詢。
1.LINQ動態(tài)查詢之Select
下面例子說明如何使用表達(dá)式樹依據(jù) IQueryable 數(shù)據(jù)源構(gòu)造一個動態(tài)查詢,查詢出每個顧客的ContactName,并用GetCommand方法獲取其生成SQL語句。
//依據(jù)IQueryable數(shù)據(jù)源構(gòu)造一個查詢 IQueryablecusts = db.Customers; //組建一個表達(dá)式樹來創(chuàng)建一個參數(shù) ParameterExpression param = Expression.Parameter(typeof(Customer), "c"); //組建表達(dá)式樹:c.ContactName Expression selector = Expression.Property(param, typeof(Customer).GetProperty("ContactName")); Expression pred = Expression.Lambda(selector, param); //組建表達(dá)式樹:Select(c=>c.ContactName) Expression expr = Expression.Call(typeof(Queryable), "Select", new Type[] { typeof(Customer), typeof(string) }, Expression.Constant(custs), pred); //使用表達(dá)式樹來生成動態(tài)查詢 IQueryable query = db.Customers.AsQueryable() .Provider.CreateQuery (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)查詢城市在倫敦的顧客。
IQueryablecusts = 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 query = db.Customers.AsQueryable() .Provider.CreateQuery (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)了過濾功能。
IQueryablecusts = 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 query = db.Customers.AsQueryable() .Provider.CreateQuery (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
下面的例子使用表達(dá)式樹LINQ動態(tài)查詢顧客和雇員同在的城市。
//e.City IQueryablecusts = 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 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 q1 = db.Customers.AsQueryable() .Provider.CreateQuery (expr1); IQueryable q2 = db.Employees.AsQueryable() .Provider.CreateQuery (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標(biāo)識
在前面這一點沒有說到,在這里作為高級特性單獨說下ID標(biāo)識。
這個例子說明我們存儲一條新的記錄時候,ContactID作為主鍵標(biāo)識,系統(tǒng)自動分配,標(biāo)識種子為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)查詢怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!