gpt4 book ai didi

c# - 如何为 IQueryable 应用表达式树?

转载 作者:行者123 更新时间:2023-12-02 17:40:58 24 4
gpt4 key购买 nike

是否有任何方法可以将手动创建的表达式树从一个 IQueryable 应用于另一个 IQueryable?例如:

IQueryable<string> p = Enumerable.Empty<string>().AsQueryable();
p = p.Where(pp => pp[0] == 'A');
p = p.Skip(2).Take(4);
p = p.OrderBy(pp => pp.Length);

var vv = new[] {"Afss", "Acv", "Adfv", "Bcvx", "Ng"}.AsQueryable();

// Filtering of the vv collection with expression from p
var filteredResult = vv.Filter(p.Expression);

或者我们必须单独应用 WhereOrderBy 表达式?

最佳答案

简单CreateQuery调用不起作用,因为提供程序使用传递表达式的数据源。

在执行表达式之前,您需要替换 Enumerable.Empty<string>()通过您的数据集合:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

public class Program
{
public static void Main()
{
IQueryable<string> p = Enumerable.Empty<string>().AsQueryable();
p = p.Where(pp => pp[0] == 'A');
p = p.Skip(2).Take(4);
p = p.OrderBy(pp => pp.Length);

var vv = new[] {"Afss", "Acv", "Adfv", "Bcvx", "Ng"}.AsQueryable();

// Filtering of the vv collection with expression from p
var expr = ExpressionTreeConstantReplacer.CopyAndReplace(p.Expression, typeof(EnumerableQuery<string>), vv);
var filteredResult = vv.Provider.CreateQuery<string>(expr);

Console.Write("Source: \t");
foreach(var temp in vv)
Console.Write("{0} ", temp);

Console.WriteLine();

Console.Write("Filtered: ");
foreach(var temp in filteredResult)
Console.WriteLine(temp);
}

class ExpressionTreeConstantReplacer<T> : ExpressionVisitor
{
Type originalType;
T replacementConstant;

internal ExpressionTreeConstantReplacer(Type originalType, T replacementConstant)
{
this.originalType = originalType;
this.replacementConstant = replacementConstant;
}

protected override Expression VisitConstant(ConstantExpression c)
{
return c.Type == originalType ? Expression.Constant(replacementConstant) : c;
}
}

class ExpressionTreeConstantReplacer
{
internal static Expression CopyAndReplace<T>(Expression expression, Type originalType, T replacementConstant)
{
var modifier = new ExpressionTreeConstantReplacer<T>(originalType, replacementConstant);
return modifier.Visit(expression);
}
}
}

关于c# - 如何为 IQueryable 应用表达式树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30670650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com