我希望能够使用lambda表达式来指定要通过wcf服务返回的值范围

时间:2010-03-05 11:09:52

标签: c# wcf delegates lambda

我不知道这是否可能......但它会很酷。问题是,是否可能,但如果可能的话,还有一些例子。

我不确定使用什么方法签名将lambda表达式传递给。

例如方法IList<Group> GetGroups()

如何修改它以便能够将lambda表达式传递给它?

接下来的问题是如何编写lambda表达式以返回所有Group对象,例如

  • where .deleted == false
  • where .DateAdded > aDate
是的,我想把月亮放在棍子上;) 提前谢谢。

(编辑我认为这实际上有点不合理,因为实际上会获取数据的数据访问层......但是假设您正在通过服务查询某些对象集合而不必担心关于dal)。

4 个答案:

答案 0 :(得分:7)

您可以使用GetGroups类型的参数声明Expression<Func<Group, bool>>方法,该参数表示组必须匹配才能返回的谓词:

IList<Group> GetGroups(Expression<Func<Group, bool>> predicateExpression);

问题是,表达式无法序列化,因此您无法将其发送到WCF服务......但是,您可能会找到一种方法来使用Expression Tree Serialization项目。

答案 1 :(得分:2)

你可以

  • 定义您的后端服务理解的简单查询语言
  • Web服务公开了一种采用此查询语言
  • 的字符串的方法
  • 编写一个客户端转换系统,该系统接收一个充满表达式树的IQueryable,并将其转换为查询语言
  • 现在客户端可以直接用查询语言编写查询,也可以编写LINQ查询,将翻译器转换为查询语言
  • 嘿,你刚发明了LINQ-To-Tortoise!

Matt Warren seventeen blog articles关于如何做这类事情。

答案 2 :(得分:1)

我认为RIA服务可以满足您的需求,但我不知道它背后的魔力。

答案 3 :(得分:0)

你可以传递一个“谓词”:一个Func<Group, bool>,它对给定的组返回true或false。由于你可以传递一个lambda,其中Func是预期的,这可能是这样的:

var fooGroups = GetGroups(g => g.Name.StartsWith("Foo"));