我的List<T>
Customers
包含以下信息:名称,产品,便笺,预订日期和UnreadMessage。
我的目标是使用这些字段过滤客户并使用AND运算符,但是当有一个字段不用于过滤时,令我感到困扰的是。
例如,助理将查找具有特定产品的客户名称。我可以使用看起来像这样的LINQ查询。
var a = Customers.Where(x => x.name.Contains("someone") && x.product.Contains("nike"));
另一个例子是,它将寻找具有特定产品的客户,并附上一些注释
var a = Customers.Where(x => x.name.Contains("someone") && x.product.Contains("nike") && x.note.Contains("some note"));
另一个例子,它将寻找产品和预订日期 var a = Customers.Where(x =&gt; x.product.Contains(“someone”)&amp;&amp; x.bookingdate = DateTime.Now);
我希望您注意到我将为此类过滤编写多少个不同的查询。
仅限姓名,产品,备注,预订日期或未读消息
我正在编写一个Windows平板电脑应用程序,所以DataTable和LINQ Dyanmics不可能只写一个字符串表达式。
我正在寻求建议,并帮助解决这种过滤问题。
答案 0 :(得分:3)
为什么不合并 Where
?
var result = Customers
.Where(item => (null == name) || item.name.Contains(name))
.Where(item => (null == product) || item.product.Contains(product))
.Where(item => (null == note) || item.note.Contains(note))
...
因此,如果您不想按任何参数(name
,product
等)过滤掉,请将其设置为null
。
答案 1 :(得分:2)
您可以动态构建语句。如果这是linq to sql
,您将从使用此方法的更简单的执行计划中受益:
public class test
{
public string name;
public string lastname;
}
class Program
{
static void Main(string[] args)
{
var list = new List<test>
{
new test{name = "john", lastname = "smith"}
};
string fname = "aa";
string lname = "sm";
var select = list.Select(c=>c);
if (fname != null)
select = select.Where(c => c.name.Contains(fname));
if (lname != null)
select = select.Where(c => c.lastname.Contains(lname));
var result = select.ToList();
}
}