Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定表达式<;Func>;linq查询的选择器_C#_Linq - Fatal编程技术网

C# 绑定表达式<;Func>;linq查询的选择器

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

我使用的库将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语句的目标应用程序不支持原始格式的
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相同的错误,但它不会影响表达式的寿命