【发布时间】:2012-12-11 19:02:45
【问题描述】:
我一直在这里查看查询表达式http://msdn.microsoft.com/en-us/library/vstudio/hh225374.aspx
我一直想知道为什么以下是合法的
let testQuery = query {
for number in netflix.Titles do
where (number.Name.Contains("Test"))
}
但你真的不能这样做
let christmasPredicate = fun (x:Catalog.ServiceTypes.Title) -> x.Name.Contains("Christmas")
let testQuery = query {
for number in netflix.Titles do
where christmasPredicate
}
F# 确实允许这样的可组合性,因此您可以重用谓词?如果我想要圣诞节标题与特定日期之前的另一个谓词相结合怎么办?我必须复制并粘贴我的整个查询? C# 与此完全不同,它有多种构建和组合谓词的方法
【问题讨论】:
-
C#完全是like这个,你不能
where predicate。你可以做Where(predicate),但我认为你也可以在这里做同样的事情。 -
我从未说过。但据我目前所见,您不能在查询表达式中执行此操作。我也有同样的想法,但似乎无法编译任何东西。互联网上也没有关于此的文献。另外,哪里只能取布尔值,而不是表达式,所以我认为您错了:) 证明吗? where(expression
) 很好,因为有像 LinqKit 这样的东西可以让你疯狂地操纵你的表达式。 -
我的 F# 3 交互有问题,但
where (christmasPredicate number)不起作用? -
不错的拉蒙;这使得我可以编译它,但显然查询表达式的翻译方式不允许翻译查询并引发异常。我不会放弃,因为我们似乎正在取得进展。在 ORM 方面,表达式树似乎比计算表达式更灵活,但就像我说的那样,我可能完全错了。
-
我没想到会这样。我的意见是 LINQ to Entities 绝对可以在 where 子句中采用任意 Expression
(可能由其他表达式构建),只要函数调用 INSIDE 表达式是可翻译的,并且它使其更加灵活和可组合。
标签: f# computation-expression query-expressions