2009-02-11 81 views
1

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

我试图了解如何使用谓词的LINQ一起SQL修改我的查询

什么,我试图做的是查询客户的表和过滤它的基础上不断变化的标准。例如

  • 找到谁拥有邮编= 90210
  • 找到谁是男性
  • 找到谁是男性,所有客户的所有客户所有的客户>有邮政编码= 90210

现在的我这样做使用if/else语句,这感觉很不错

也有可能,我将不得不添加其他过滤器,所以我想要一个灵活的解决方案,这个问题很容易扩展无线thout打破任何东西(开闭原则,我认为)

+0

回复您的评论 - 事实上,大多数LINQ操作具有“延迟执行”(没有任何反应,直到你迭代它),让您在“撰写”一个逐步查询 - 通过一系列步骤添加过滤器/排序/投影等。只有Count(),Max()等东西立即执行。 – 2009-02-11 23:41:25

回答

0

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

嘛,有什么特别的你想做什么?

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

在最简单的:

谁是男性,>有邮政编码= 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

+0

我想要做的是查询客户的表格,并根据更改标准对其进行过滤。例如 找到谁拥有邮编= 90210 找到谁是男性 找到谁是男性,所有客户的所有客户所有的客户>有邮政编码= 90210 现在我使用的if/else这感觉非常不对 – jorsh1 2009-02-11 19:41:59

1

谓词可以简单地通过以下的签名的方法:

bool Predicate<T>(T item) 

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

它是在链路过滤可枚举使用在.Where条款中。

您也可以使用返回一个布尔值的lambda表达式:

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