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();
}
谢谢,这正是我想要的!:)不幸的是,我不能点击“向上投票”,因为我没有足够的分数,但这真的很有帮助:)谢谢,这正是我想要的!:)不幸的是,我不能点击“投票”,因为我没有足够的分数,但这确实有帮助:)