2010-08-26 30 views
1

我正在爲我的網站搜索網頁。要求規定用戶可以輸入任何9+個字段組合的文本,並且在查詢數據庫時,搜索應該執行'AND'匹配。我可以很快地使用'ISNULL'將其作爲存儲過程編寫,但我試圖弄清楚如何在LINQ中完成同樣的事情。我以爲我可以查詢的查詢的結果,但我得到的錯誤帶有動態數量的邏輯AND的LINQ查詢

「可以在客戶端上進行評估論證,只有支持的String.Contains法」

這裏的我的例子

var people = db.People 

if(null != fname) 
{ 
people= from e in people 
    where e.FirstName.Contains(fname) 
    select e; 
} 

if(null != lname) 
{ 
people= from e in people 
    where e.LastName.Contains(lname) 
    select e; 
} 

return people; 

我可以查詢以前的查詢的結果集嗎?有沒有更好的方法,我只是沒有想到?

在此先感謝。

回答

2

這應該工作,似乎更加簡單:

people = from e in db.People 
    where (lname == null || e.LastName.Contains(lname)) 
     && (fname == null || e.FirstName.Contains(fname)) 
    select e; 

您提供隱而不宣的代碼沒有任何明顯的錯誤,因爲沒有理由不能查詢另一個查詢的結果。它看起來像fnamelname正在以SQL生成器不理解的某種方式定義。

+0

+1,很好的解決方案,它可以在Linq-to-Sql中工作。只是FYI,我以前使用LLBLGen時遇到過這種模式的問題。 – kbrimington 2010-08-26 21:06:26

+0

這就像一個魅力,謝謝。 – 2010-08-26 21:10:37

+0

如果以上述相同的形式將它傳遞給SQL,它將運行*糟糕* – gbn 2010-08-26 21:13:47

4

這應做到:

var people = db.People; 
if(!String.IsNullOrEmpty(fname)) 
    people = people.Where(p => p.FirstName.Contains(fname)); 
if(!String.IsNullOrEmpty(lname)) 
    people = people.Where(p => p.LastName.Contains(lname)); 
return people; 
3

我有時會通過直接調用擴展方法實現更少的線一樣的東西:

var people = from e in db.People select e; 

if(null != fname) 
{ 
    people = people.Where(e => e.FirstName.Contains(fname)); 
} 

if(null != lname) 
{ 
    people = people.Where(e => e.LastName.Contains(lname)); 
} 

return people;