1

有没有什么好的在线教程来学习 c# 2.0 语言特性“谓词”?

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

我想做的是查询客户表并根据不断变化的标准对其进行过滤。例如

  • 查找所有邮政编码 = 90210 的客户
  • 查找所有男性客户
  • 查找所有男性且 > 邮政编码 = 90210 的客户

现在我正在使用 if/else 语句来做这件事,感觉很不对劲

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

4

2 回答 2

1

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

bool Predicate<T>(T item)

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

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

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

item => item.Nickname == "ThinkBeforeCoding";
于 2009-02-11T12:24:13.070 回答
0

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

好吧,你具体想做什么?

谓词只是过滤器(作为委托或表达式);它们不允许您直接修改 TSQL 等,除非您将它们与 LINQ-to-SQL 提供程序可以处理的函数(这些)或映射到您的数据上下文的 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);

ETC

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

于 2009-02-11T10:27:00.667 回答