【发布时间】:2016-01-15 01:36:57
【问题描述】:
我正在使用将 linq 表达式转换为事件查询的库。 (流洞察力)。
我需要解决这个问题:
给定一些值,以及一个组合值的表达式。
var a = new[] { "a", "b", "c" };
var b = new[] { "x", "y", "z" };
Expression<Func<string, string, string>> combine = (x, y) => x + ":" + y;
我需要将 combine 函数绑定到以下查询,同时仍保持表达式语法。
var query =
from f in a
from g in b
select combine(f, g);
query.Dump();
很遗憾,此 linq 语句的目标应用程序不支持原始格式的 Func<string, string, string>,因为查询是在运行时解释的。
我收到此错误:其他信息:Microsoft 复杂事件处理 LINQ 提供程序不支持以下表达式:'Invoke(value(System.Func`3...
如果我可以重现表达式,我想我会解决这个问题:
var query =
from f in a
from g in b
select x + ":" + y;
我想将查询的选择部分作为Expression<Func<... 参数传递给函数。
我试过了,显然不太好用:
var query =
a.SelectMany(a1 => b, (x, y) => new { x, y })
.Select(_ => combine(_.x, _.y));
我已经简化了这个问题,但作为参考,真正的查询看起来像这样:
var ms =
requestStream
.AlterEventLifetime(
_ => _.StartTime - TimeSpan.FromMilliseconds(10000),
_ => _.EndTime + TimeSpan.FromMilliseconds(10000) - _.StartTime)
.SelectMany(requestData => responseStream
.AlterEventLifetime(
_ => _.StartTime - TimeSpan.FromMilliseconds(10000),
_ => _.EndTime + TimeSpan.FromMilliseconds(10000) - _.StartTime),
(requestData, responseData) => new {requestData, responseData})
.Where(@t => @t.requestData.CorrelationTicketId == @t.responseData.CorrelationTicketId)
.Where(@t => @t.requestData.CorrelationTicketId > 0
&& @t.requestData.SuccessFailureCode != 3001)
.Select(@t => expression(@t.requestData, @t.responseData));
【问题讨论】:
-
.SelectMany(a1 => b, combine)工作吗? -
否,CS1929 'string[]' 不包含 'SelectMany' 的定义和最佳扩展方法重载 'Queryable.SelectMany
(IQueryable 的接收器, Expression>>, Expression >)' 需要类型为 'IQueryable ' -
除此之外,我真的需要弄清楚如何将它绑定到 select,因为我的现实世界场景也有很多 where 子句。
-
第一个错误是使用数组作为mock源引起的;如果您在
a上致电AsQueryable,它就会消失。我想你可能会从拨打.Select(expression)而不是.Select(t => expression(...))获得一些乐趣