2017-06-02 54 views
0

我在那裏基於幾個參數語句LINQ上,我篩選的結果是這樣的:餡料可選參數where語句

.Where(x=> x.Sales>0 && (filterWord=="" ||x.Title.Contains(filterWord.ToLower()))) 
    .OrderByDescending(x=>x.Sales) 
    .Skip(skip) 
    .Take(pageSize); 

我想篩選出所有符合要求的產品無論哪種方式(> 0銷售)...但是,對於過濾詞的參數,如果它==「」,那麼我不想考慮參數的帳戶。如果參數是!=「」,我想根據參數+至少有一次銷售的產品過濾出我的集合。

通過Where方法,如果是的話怎麼這是可行的?

回答

1

您的解決方案應該工作,這裏是另一種方式

.Where(x=> x.Sales>0 && (string.IsNullOrEmpty(filterWord) || x.Title.Contains(filterWord.ToLower()))) 
+0

它看起來不錯就這樣,我就只是測試了帶有可選的參數有 – User987

1
.Where(x => filterWord == "" || (x.Title.Contains(filterWord.ToLower()) && x.Sales.Any())) .OrderByDescending(x => x.Sales) .Skip(skip) .Take(pageSize); 
+0

你寫:x.Sales> 0,所以x.Sales是一個數字,或者至少與一個數字。你也使用x.Sales.Any()。所以x.Sales實現了IEnumerable,或者用語言來說:它代表一個序列。序列可以與數字進行比較嗎? –

+0

這是一個錯誤:'。凡(X => filterWord == 「」 ||(x.Title.Contains(filterWord.ToLower())&& x.Sales.Any())) .OrderByDescending(X => X (銷售) .Skip(跳過) .Take(pageSize);' – Yann

+0

所以編輯你的答案並刪除錯誤 –

1

對於第二部分,它要麼匹配空字符串沒有空字符串和標題過濾器。

.Where(x=> x.Sales > 0 && ((filterWord == "") || (filterWord != "" && x.Title.Contains(filterWord))) 
1

你爲什麼要讓數據服務器做一些最好的代碼?

string filterWord = "m2"; 

IQueryable<MyTable> q = db.MyTables; 

if (!String.IsNullOrEmpty(filterWord)) 
    q = q.Where(t=> t.Sales > 0 && t.Title.Contains(filterWord.ToLower())); 

q = q.OrderByDescending(x=>x.Sales) 
    .Skip(skip) 
    .Take(pageSize); 

q.Dump(); 

UPDATE:

IQueryable<MyTable> q = db.MyTables.Where(t=> t.Sales > 0); 

if (!String.IsNullOrEmpty(filterWord)) 
    q = q.Where(t=>t.Title.Contains(filterWord.ToLower())); 

兩個連續Where()旨意作爲一個和。

+0

嘿,詹姆斯,謝謝你的回覆......過濾詞不在那裏的情況如何? ) – User987

+0

@ User987你的問題有點容易混淆 - 我要按照spec:if filterWord ==「」,所有項目;如果filterWord!=「」,則至少有一個商品出售,並匹配filterWord。如果你想要別的東西,請澄清。 –

+0

我認爲這是不正確稍微:上'Sales',即'噸=> t.Sales> 0',過濾器應被無條件地施加,而在這裏它與非空'filterWord'僅一起應用。 – dasblinkenlight