LINQ那些事兒(5) 動態查詢

2022-02-25 02:47:02 字數 2671 閱讀 6263

本文討論了在linq2sql中執行動態查詢的方法

所謂動態查詢,是指查詢條件或查詢值都是在執行時才能確定的查詢。這就意味著我們不能hard-code定義查詢變數(query variable),只有根據查詢時傳遞的條件來拼湊。下面我們看看幾組不同條件組合的查詢。

1) 使用者輸入查詢條件:city為」london」且contactname包含」thomas」

public iqueryablegetcustomers(string city, string contactname)

if (!string.isnullorempty(contactname))

return result;

}

2) 使用者輸入查詢條件:city為」london」或」paris」

由於where和where的連線是表示and的關係,所以我們無法用1)的方法來表達這個查詢。有乙個可以利用的query operator是union:

var context = generatecontext();

iqueryableresult = null;

string cities = ;

foreach (string item in cities)

context.log = console.out;

console.writeline(result.count());

雖然結果符合我們的要求,但是通過輸出的sql語句,你可以看到對於這種方式構造的expression tree,sql並沒有我們想要的精簡(我們期望的是t0.city=』london』 or t0.city=』paris』)。輸出sql如下:

select count(*) as [value]

from (

select [t0].[customerid], [t0].[companyname], [t0].[contactname], [t0].[cont

acttitle], [t0].[address], [t0].[city], [t0].[region], [t0].[postalcode], [t0].[

country], [t0].[phone], [t0].[fax]

from [dbo].[customers] as [t0]

where [t0].[city] = @p0

union

select [t1].[customerid], [t1].[companyname], [t1].[contactname], [t1].[cont

acttitle], [t1].[address], [t1].[city], [t1].[region], [t1].[postalcode], [t1].[

country], [t1].[phone], [t1].[fax]

from [dbo].[customers] as [t1]

where [t1].[city] = @p1

) as [t2]

另外的方法就是是根據所有查詢條件和查詢值,給where構造乙個expession。首先來看看where的簽名:

iqueryablewhere(this iqueryablesource, expression> predicate)
對於這樣乙個expression,如果你熟悉expression tree的構造方法,完全可以自己寫。《c# 3.0 in nutshell》的作者寫了乙個小巧的prediatebuilder,可以幫助我們用lambda expression快速構造這樣的expression:

var context = generatecontext();

expression> filter = predicatebuilder.false();

string cities = ;

foreach (string item in cities)

context.log = console.out;

context.customers.where(filter).count().dump();

輸出的sql也是我們期待的結果

select count(*) as [value]

from [dbo].[customers] as [t0]

where ([t0].[city] = @p0) or ([t0].[city] = @p1)

最後,如果你對以前拼接sql語句的方式還是念念不忘的話,可以去用dynamic linq,參考socttgu』s blog。

predicatebuilder

dynamic linq 

1、 linq那些事兒(1)- 定義從關聯式資料庫到entity class的對映

2、 linq那些事兒(2)- 簡單物件的crud操作和association的級聯操作

3、 linq那些事兒(3)- 事務和併發衝突處理

4、 linq那些事兒(4)- query expression和query operator

5、 linq那些事兒(5)- 動態查詢

6、 linq那些事兒(6)- datacontext的物件生命週期管理

7、 linq那些事兒(7)- 通過自定義ienumerable來擴充套件linq

8、linq那些事兒(8)- 通過自定義iqueryable和iqueryableprovider來擴充套件linq

Linq 動態查詢

最近在做專案中用到了linq to sql,在用的時候感覺很,寫的 也少 提高了開發的週期 但是在開發的過程中我們還是碰到很多的東西,由於是第一把linq用到專案中,原來是寫個小的demo 沒有過多的用到他的優點 看看我的文件目錄吧 第二 就可以寫查詢的 了 public partial class...

Linq 動態查詢

如果是傳統的應用程式開發,採取動態拼 sql字串的形式就可以解決了,但linq 是沒辦法間歇性判斷而拼接.首先ui上查詢條件的專案往往並不確定,如上圖目前有城市 訂單數目,將來可能有新的專案要增加,結果將導致 頻繁更改,對於這種情況無論是拼sql時代,還是如今的linq都不太容易應對,故而當有新的查...

linq動態查詢

近日做幾個專案用到linq動態查詢,但微軟官方所提供的那些動態查詢機制相當複雜,網上也有不少發過一些動態查詢的方案,本人覺得那些方案比較繁索,也不易理解,今提供一種易理解簡單實用的方法.方法如下 在中間層寫 public listgettransferlogbycondition datetime?...