2015-04-07 120 views
1

我需要根据多列筛选列表。这里是我的课,我需要寻找筛选多列的列表

public class psdata 
    { 
     public int ID { get; set; } 
     public string Customer { get; set; } 
     public string Address { get; set; } 
     public string City { get; set; } 
     public string State { get; set; } 
     public string Zip { get; set; } 
     public decimal? Identification { get; set; } 
     public decimal? Assesment { get; set; } 
     public decimal? PayoffLedger { get; set; } 
     public decimal? RentRestrictions { get; set; } 
     public decimal? CCR { get; set; } 
     public decimal SubTotal { get; set; } 
    } 

这里是我的LINQ查询,看起来我的列表,然后将找到的搜索词,如果它被包含在列。

var sl = list.Where<psdata>(c => c.Address.ToLower().Contains(text)); 

这对第一列非常有用。但是,如果我想添加另一列如此。

var sl = list.Where<psdata>(c => c.Address.ToLower().Contains(text) || c => c.City.ToLower().Contains(text)); 

我得到一个错误

Operator || cannot be applied to operands of the type bool and psdata. 

什么我错在这里做什么?

回答

1

的问题是要传递一个以上的lambda表达式where,而不是在你的lambda表达式使用&&||多个比较结合起来。

this; c => c.Address.ToLower().Contains(text) || c => c.City.ToLower().Contains(text)

应该是; c => c.Address.ToLower().Contains(text) || c.City.ToLower().Contains(text)

2
var sl = list.Where<psdata>(c => c.Address.ToLower().Contains(text) || c => c.City.ToLower().Contains(text)); 

应该

var sl = list.Where<psdata>(c => c.Address.ToLower().Contains(text) || c.City.ToLower().Contains(text)); 

你并不需要第二个 '去' =>运营商在你的表达。

6

您唯一的问题是第二个c =>。你还是只有通过一个单一的Lambda表达式,它只是需要包括||操作:

var sl = list.Where(c => c.Address.ToLower().Contains(text) || 
    c.City.ToLower().Contains(text)); 
2

如果您查看的Where条款的签名,它期待Func<TSource, Boolean>。这意味着您必须传入一个采用TSource类型的函数,并返回布尔值。我们传递一个匿名函数作为参数。匿名函数的语法是(argument)=>{ expression }。所以,你的代码可以解释为

list.Where<psdata>(Func<psdata,bool>||Func<psdata,bool>) 

这显然不像预期的那样表现。因此,解决办法是

list.Where<psdata>(c => c.Address.ToLower().Contains(text) 
|| c.City.ToLower().Contains(text));