2017-06-02 29 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