C# 从IQueryable获取<;T>;谓词函数<;T、 布尔>;

C# 从IQueryable获取<;T>;谓词函数<;T、 布尔>;,c#,linq,expression,iqueryable,func,C#,Linq,Expression,Iqueryable,Func,我正在尝试将查询从一个集合应用到另一个集合。 我的测试样本: [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { Expression sourceExpression = Amazings().Where(x => x.Name.Equals("Kasa")).AsQueryable().Expression; Expressi

我正在尝试将查询从一个集合应用到另一个集合。 我的测试样本:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Expression sourceExpression = Amazings().Where(x => x.Name.Equals("Kasa")).AsQueryable().Expression;

        Expression<Func<Amazing, bool>> predicate = Expression.Lambda<Func<Amazing, bool>>(sourceExpression, Expression.Parameter(typeof(Amazing)));

        var col2 = Amazings().Where(predicate.Compile());
    }

    private IEnumerable<Amazing> Amazings()
    {
        var amazings = new List<Amazing>
            {
                new Amazing
                    {
                        Name = "Kasa",
                    },
                new Amazing
                    {
                        Name = "Ma@p2a"
                    }
            };
        return amazings;
    }

    class Amazing
    {
        public string Name { get; set; }
    }
}
[TestClass]
公共类UnitTest1
{
[测试方法]
公共void TestMethod1()
{
表达式sourceExpression=Amazings()。其中(x=>x.Name.Equals(“Kasa”)).AsQueryable().Expression;
表达式谓词=Expression.Lambda(sourceExpression,Expression.Parameter(typeof(惊人));
var col2=Amazings().Where(predicate.Compile());
}
私人侦探《无数惊异》
{
var amazings=新列表
{
新的惊人
{
Name=“Kasa”,
},
新的惊人
{
名称=”Ma@p2a"
}
};
回报惊喜;
}
令人惊奇的课堂
{
公共字符串名称{get;set;}
}
}
怎么了? 在debug中运行此测试时,出现异常:

对于返回类型“System.Boolean”,不能使用诸如“System.Linq.EnumerableQuery`1[UnitTestProject1.UnitTest1+Amazing]”之类的表达式

如果我在没有参数的情况下运行它,我会得到一个异常,即我没有参数

若我将参数更改为布尔类型,我会遇到一个异常:不能将元素布尔类型用于委托参数类型

我测试了几个选项,但没有任何效果

我还发现,该键可能是通过将表达式强制转换为:MethodCallExpression来实现的,但它不是,或者我不知道如何实现

我试过这样的东西:

MethodCallExpression e = query.Expression as MethodCallExpression;
        MemberExpression memberExpression = (MemberExpression)e.Object;

        Expression<Func<Amazing, bool>> getCallerExpression = Expression<Func<Amazing>>.Lambda<Func<Amazing, bool>>(memberExpression);
MethodCallExpression e=query.Expression作为MethodCallExpression;
MemberExpression MemberExpression=(MemberExpression)e.Object;
表达式getCallerExpression=Expression.Lambda(memberExpression);
不幸的是,memberExpression为空

我在网上搜索,唯一发现的是一条提示:~“不要这样做”


我怎样才能实现我的目标呢?

既然你在调用
可枚举。Where
而不是
可查询。Where
你拥有的lambda从来没有被翻译成
表达式,它只被编译成一个方法,而你拥有的
IQueryable
甚至没有任何方法可以到达该委托,因为它看到的是一个任意的
IEnumerable
,因为您正在调用
可枚举。Where
而不是
可查询。Where
您拥有的lambda从未被翻译成
表达式,它只被编译成一个方法,而您拥有的
IQueryable
甚至没有任何方法可以到达该委托,因为它看到的只是一个任意的
IEnumerable
不清楚您想要做什么。。。但正如Servy所写,您将
AsQueryable()
放在了错误的位置。正确的位置是
.Where()
之前,这是一个单元测试,我建议返回数据的方法应该直接返回
IQueryable
,以便更好地模拟代码中的“正常”查询

试着看看这是不是你想要的

public void TestMethod1()
{
    var q1 = Amazings().Where(x => x.Name.Equals("Kasa"));

    Expression predicate = q1.Expression;

    var q2 = Amazings();
    IQueryable<Amazing> q3 = q2.Provider.CreateQuery<Amazing>(predicate);
}

private IQueryable<Amazing> Amazings()
{
    var amazings = new List<Amazing>
    {
        new Amazing
            {
                Name = "Kasa",
            },
        new Amazing
            {
                Name = "Ma@p2a"
            }
    };
    return amazings.AsQueryable();
}

不清楚你想做什么。。。但正如Servy所写,您将
AsQueryable()
放在了错误的位置。正确的位置是
.Where()
之前,这是一个单元测试,我建议返回数据的方法应该直接返回
IQueryable
,以便更好地模拟代码中的“正常”查询

试着看看这是不是你想要的

public void TestMethod1()
{
    var q1 = Amazings().Where(x => x.Name.Equals("Kasa"));

    Expression predicate = q1.Expression;

    var q2 = Amazings();
    IQueryable<Amazing> q3 = q2.Provider.CreateQuery<Amazing>(predicate);
}

private IQueryable<Amazing> Amazings()
{
    var amazings = new List<Amazing>
    {
        new Amazing
            {
                Name = "Kasa",
            },
        new Amazing
            {
                Name = "Ma@p2a"
            }
    };
    return amazings.AsQueryable();
}

谢谢,这正是我想要的!:)不幸的是,我不能点击“向上投票”,因为我没有足够的分数,但这真的很有帮助:)谢谢,这正是我想要的!:)不幸的是,我不能点击“投票”,因为我没有足够的分数,但这确实有帮助:)