用于学习谓词的资源

时间:2009-02-11 10:21:17

标签: c# linq-to-sql predicate

有没有在线学习c#2.0语言功能“谓词”的好教程?

我正在尝试学习如何使用谓词和linq来修改我的查询

我要做的是查询客户表并根据更改的条件对其进行过滤。例如

  • 找到所有拥有zipcode = 90210
  • 的客户
  • 找到所有男性客户
  • 找到所有男性客户>有zipcode = 90210

现在我正在使用感觉非常错误的if / else语句

另外,我可能需要添加其他过滤器,所以我想要一个灵活的解决方案来解决这个问题,这个问题很容易扩展而不会破坏任何东西(我认为是开放的封闭原则)

2 个答案:

答案 0 :(得分:1)

谓词只是具有以下签名的方法:

bool Predicate<T>(T item)

它表示可由T类型的对象验证或不验证的条件。

在链接中用于过滤.Where子句中的可枚举。

您还可以使用返回布尔值的lambdas:

item => item.Nickname == "ThinkBeforeCoding";

答案 1 :(得分:0)

(顺便说一句 - 与LINQ-to-SQL一起使用的基于lambda的谓词是C#3.0 / .NET 3.5,而不是C#2.0)

嗯,具体你想做什么?

谓词只是过滤器(作为委托或表达式);他们不直接允许您修改TSQL等,除非您将它们与LINQ-to-SQL提供程序可以处理的函数(these)或映射到您的数据的UDF组合在一起-context作为可组合函数(FunctionAttribute)。

最简单的:

谁是男性&gt;有邮政编码= 90210

var qry1 = from cust in ctx.Customers
          where cust.Gender == 'M' && cust.Zip = '90210'
          select cust;

var qry2 = from cust in ctx.Customers
          where cust.Zip = '90210'
          select cust;

或者对于一个非平凡的例子(动态搜索表单/单独组合)

IQueryable<Foo> query = ctx.Customers;
// note "gender" here is "char?" for this example
if(gender != null) query = query.Where(x=>x.Gender == (char)gender);
if(zip != null) query = query.Where(x=>x.Zip == zip);

您也可以手动构建基于表达式的谓词,但这需要更多工作,并且需要了解Expression API