C# 绑定表达式<;Func>;linq查询的选择器
我使用的库将linq表达式转换为事件查询。(streaminsight) 我需要解决这个问题: 给定一些值,以及组合值的表达式C# 绑定表达式<;Func>;linq查询的选择器,c#,linq,C#,Linq,我使用的库将linq表达式转换为事件查询。(streaminsight) 我需要解决这个问题: 给定一些值,以及组合值的表达式 var a = new[] { "a", "b", "c" }; var b = new[] { "x", "y", "z" }; Expression<Func<string, string, string>> combine = (x, y) => x + ":" + y; 不幸的是,此linq语句的目标应用程序不支持原始格式的Fun
var a = new[] { "a", "b", "c" };
var b = new[] { "x", "y", "z" };
Expression<Func<string, string, string>> combine = (x, y) => x + ":" + y;
不幸的是,此linq语句的目标应用程序不支持原始格式的Func
,因为查询是在运行时解释的
我收到以下错误:其他信息:Microsoft复杂事件处理LINQ提供程序不支持以下表达式:'Invoke(value)(System.Func`3…
我想如果我能重现这个表达式,我会解决这个问题:
var query =
from f in a
from g in b
select x + ":" + y;
我想将查询的select部分作为
表达式传递到函数中。在将其用作函数之前,必须编译表达式:
var a = new[] { "a", "b", "c" };
var b = new[] { "x", "y", "z" };
Expression<Func<string, string, string>> combine = (x, y) => x + ":" + y;
var fu = combine.Compile();
var query =
from f in a
from g in b
select fu(f, g);
var a=new[]{“a”、“b”、“c”};
var b=新[]{“x”,“y”,“z”};
表达式combine=(x,y)=>x+“:”+y;
var fu=combine.Compile();
变量查询=
从a中的f开始
从g到b
选择fu(f,g);
必须先编译表达式,然后才能将其用作函数:
var a = new[] { "a", "b", "c" };
var b = new[] { "x", "y", "z" };
Expression<Func<string, string, string>> combine = (x, y) => x + ":" + y;
var fu = combine.Compile();
var query =
from f in a
from g in b
select fu(f, g);
var a=new[]{“a”、“b”、“c”};
var b=新[]{“x”,“y”,“z”};
表达式combine=(x,y)=>x+“:”+y;
var fu=combine.Compile();
变量查询=
从a中的f开始
从g到b
选择fu(f,g);
附加说明:
表达式
是未编译的表达式树。如果要将其发送给需要解析表达式树并转换它们(而不仅仅是运行代码)的提供程序(如Entity Framework),则需要使用它
您的案例涉及一个确实需要这样做的提供程序,而不是在使用前编译表达式(当您尝试将该代码块与实际StreamInsight源代码一起重用时,这是行不通的)。您最好在模拟数组上调用AsQueryable()
,如下所示:
// using function form of LINQ because it's more flexible
// also, using the join because that's what your query does - a cartesian product
var query = a.AsQueryable().Join(b.AsQueryable(), x => 0, x => 0, combine);
我还建议您研究一下IQStreamable接口提供程序和扩展方法(来自StreamInsight)的实际工作原理,因为我不认为裸阵列是模拟事件流的最佳选择。其他解释:
表达式
是未编译的表达式树。如果要将其发送给需要解析表达式树并转换它们(而不仅仅是运行代码)的提供程序(如Entity Framework),则需要使用它
您的案例涉及一个确实需要这样做的提供程序,而不是在使用前编译表达式(当您尝试将该代码块与实际StreamInsight源代码一起重用时,这是行不通的)。您最好在模拟数组上调用AsQueryable()
,如下所示:
// using function form of LINQ because it's more flexible
// also, using the join because that's what your query does - a cartesian product
var query = a.AsQueryable().Join(b.AsQueryable(), x => 0, x => 0, combine);
我还建议您研究一下IQStreamable接口提供程序和扩展方法(来自StreamInsight)实际上是可行的,因为我不认为裸数组是模拟事件流的最佳选择。HimBromBeere的答案会奏效,如果你只打算将它用于a
和b
的内存IEnumerable
源,那么它就是最好的选择
否则,虽然它仍然可以使用IQueryable
,但它将通过将相关字符串传递到内存中来实现,而不是将表达式向下推到提供程序中,以便它可以成为SQL查询,等等
要将IQueryable
处理为IQueryable
,您需要:
var query = a.AsQueryable().SelectMany(_ => b, combine);
(当在IEnumerable
上运行时,这会成为一种稍微昂贵的方法a.SelectMany(=>b,combine.Compile());
这是编写他给出的答案的另一种方法).HimBromBeere的答案会起作用,如果你只打算将它与a
和b
的内存IEnumerable
源一起使用,那么它就是你要找的答案
否则,虽然它仍然可以使用IQueryable
,但它将通过将相关字符串传递到内存中来实现,而不是将表达式向下推到提供程序中,以便它可以成为SQL查询,等等
要将IQueryable
处理为IQueryable
,您需要:
var query = a.AsQueryable().SelectMany(_ => b, combine);
(当在IEnumerable
上运行时,这将成为一种稍微昂贵的方法来执行a.SelectMany(=>b,combine.Compile());
这是编写他给出的答案的另一种方法)。是否.SelectMany(a1=>b,combine)
工作?不,CS1929'字符串[]'不包含'SelectMany'和最佳扩展方法重载'Queryable.SelectMany(IQueryable,Expression,Expression)的定义'需要类型为'IQueryable'的接收器。除此之外,我还需要弄清楚如何将其绑定到select,因为我的真实场景中也有许多where子句。第一个错误是使用数组作为模拟源造成的;如果在a
上调用AsQueryable
,它就会消失。我想调用可能会让您感到一些乐趣Select(expression)
而不是。Select(t=>expression(…)
是否。SelectMany(a1=>b,combine)
有效?否,CS1929“string[]”不包含“SelectMany”和最佳扩展方法重载“Queryable”的定义。SelectMany(IQueryable,expression,expression)'需要类型为'IQueryable'的接收器。除此之外,我还需要弄清楚如何将其绑定到select,因为我的真实场景中也有许多where子句。第一个错误是使用数组作为模拟源造成的;如果在a
上调用AsQueryable
,它就会消失。我想调用可能会让您感到一些乐趣选择(表达式)
而不是。选择(t=>expression(…)
有什么原因要关闭吗?你是对的,就是这样。很有魅力…我原以为这会导致与Func相同的错误,但它不会影响表达式的寿命