【发布时间】:2015-06-25 18:23:08
【问题描述】:
我正在尝试将查询从一个集合应用到另一个集合。 我的测试样本:
[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; }
}
}
怎么了? 当我在调试中运行这个测试时,我得到了异常:
对于返回类型“System.Boolean”,您不能使用诸如“System.Linq.EnumerableQuery`1[UnitTestProject1.UnitTest1+Amazing]”之类的表达式。
如果我在没有参数的情况下运行它,我会遇到我没有参数的异常。
如果我将参数更改为布尔类型,则会出现异常:您不能将元素 bool 类型用于委托参数类型 Amazing...
我测试了更多选项,但没有任何效果。
我还发现关键可以通过将 Expression 转换为: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);
不幸的是 memberExpression 为空。
我在网上搜索,唯一发现的就是一个提示:~“不要这样做”。
我怎样才能实现我的目标?
【问题讨论】:
标签: c# linq expression iqueryable func