2010-07-16 162 views
2

我有一個很長的LinqtoSQl查詢,其中幾個參數我不強迫用戶指定任何東西。我開始使用Select Case語句來測試參數字符串的長度是否大於0或者是否大於0。但是我意識到必須測試每種可能性並根據每種可能性創建查詢。LINQTOSql缺少參數問題

我做了一些搜索並跑過一篇帖子,回覆帖子的人說這個帖子否定了查詢的一部分||。在做了一些更多的搜索(並且實現了很少的C#技能後,我確實知道||是OR條件語句),我意識到這對我沒有幫助。

我想我想要做的是一樣的東西

Dim r = From x in db.List _ 
     (if firstName.Length < 1 then ignore query 
     else)where x.firstName = firstName _ 
     (if lastName.Length < 1 then ignore query 
     else)where x.LastName = lastName _ 
     Select x 

我KNW必須有比通過這個IfElse'ing我的方式更好的辦法......我正要做一些時髦的東西與一個StringBuilder,但我不知道它會「火」,即:

Dim sb as New StringBuilder 
sb.Append("Dim r = From x in db.List _") 
If firstName.Length < 1 then 
    sb.Append("Where x.firstName = firstName") 

ughh,請告訴我有一個更好的辦法...

感謝您的幫助!

回答

2

使用查詢可組合的事實。我會用C#編寫這個代碼,然後將它翻譯成VB,如果你需要的話。原則是一樣的。

IQueryable<YourEntityType> query = db.List; 
if (firstName != "") 
{ 
    query = query.Where(x => x.firstName == firstName) 
} 
if (lastName != "") 
{ 
    query = query.Where(x => x.lastName == lastName) 
} 

現在剛剛從query適當讀。 (我已經改變了字符串條件的性質,因爲它更容易理解「這個字符串是空字符串」而不是「這個字符串的長度大於0」 - 兩者都會工作,顯然)。

請注意,您不能在查詢表達式中進行這種條件調用,但當您只是明確調用擴展方法時很容易。

+0

我想我需要你來翻譯這對我來說... 我喜歡這個想法,但... 我試圖 昏暗查詢作爲的IQueryable(名單)= db.List query.Where(x => x.firstName == firstName) 但intellesense去嘗試輸入其他東西,然後我得到警告和錯誤,未聲明x ... 謝謝! – wali 2010-07-16 19:47:08

+0

只是想通了... query.Where(函數(x)x.firstName = firstName) 傻VB! 非常感謝! – wali 2010-07-16 20:08:20

0

......怎麼

Dim r = From x in db.List _ 
     where (x.firstName = firstName Or firstName = "") _ 
     And (x.LastName = lastName Or lastName = "") _ 
     Select x 
+0

名字和姓氏字段是不可空的,所以firstName =「」永遠不會返回true ... 我只是不讓用戶在搜索過程中指定一個名字... 謝謝! – wali 2010-07-16 19:51:20