.net Linq表达式引发InvalidOperationException
我正在构建一个.net Linq表达式引发InvalidOperationException,.net,linq,nhibernate,lambda,linq-expressions,.net,Linq,Nhibernate,Lambda,Linq Expressions,我正在构建一个表达式,它应该表示一个等于属性和一个类型为可空的常量的比较。换句话说,编译表达式应该返回类似于x=>(x.Id==value)的lambda,其中Id和value都是long?类型 代码如下: private static Expression<Func<T, bool>> GetNullableIdEqualsQuery(long? value) { var type = typeof(T); var idProperty = type.
表达式
,它应该表示一个等于
属性和一个类型为可空的常量的比较。换句话说,编译表达式应该返回类似于x=>(x.Id==value)
的lambda,其中Id
和value
都是long?
类型
代码如下:
private static Expression<Func<T, bool>> GetNullableIdEqualsQuery(long? value)
{
var type = typeof(T);
var idProperty = type.GetProperty("Id");
var xParam = Expression.Parameter(type, "x");
var block = Expression.Block(
typeof(bool),
Expression.Equal(
Expression.Property(xParam, idProperty),
Expression.Constant(value, typeof(long?)))
);
return Expression.Lambda<Func<T, bool>>(block, xParam);
}
测试(仅适用于lambda编译版本):
[TestClass]
公共类ExpressionHelperTest
{
课堂测试
{
公共长Id{get;set;}
}
[测试方法]
public void GetEqualsQueryWorksForSimpleTypes()
{
//为lambda x=>x.Id==5创建一个查询
var lambda=ExpressionHelper
.GetEqualsQuery(5,“Id”)
.Compile();
IsTrue(lambda(newtest(){Id=5}));
IsFalse(lambda(newtest(){Id=8}));
}
}
只是不要使用表达式。Block
:
var body = Expression.Equal(
Expression.Property(xParam, idProperty),
Expression.Constant(value, typeof(long?)));
return Expression.Lambda<Func<T, bool>>(body, xParam);
只是不要使用表达式。Block
:
var body = Expression.Equal(
Expression.Property(xParam, idProperty),
Expression.Constant(value, typeof(long?)));
return Expression.Lambda<Func<T, bool>>(body, xParam);
我认为您示例中的代码运行良好;是否可能在实际代码中,您没有向表达式提供参数(在Lambda
调用中),或者您正在编写表达式,而没有替换参数?@Marc:实际上,我是在将其传递给NHibernate(不完全是最新版本),因此,null
check可能没有在其提供程序中正确实现(如下面所述);是否可能在实际代码中,您没有向表达式提供参数(在Lambda
调用中),或者您正在编写表达式,而没有替换参数?@Marc:实际上,我是在将其传递给NHibernate(不完全是最新版本),因此,null
check可能未在其提供程序中正确实现(如下所述)。
var body = Expression.Equal(
Expression.Property(xParam, idProperty),
Expression.Constant(value, typeof(long?)));
return Expression.Lambda<Func<T, bool>>(body, xParam);
private static Expression<Func<T, bool>> GetNullableIdEqualsQuery<T>(long? value)
{
var xParam = Expression.Parameter(typeof(T), "x");
Expression body;
if (value == null)
{
body = Expression.Not(
Expression.Property(
Expression.Property(xParam, "Id"),
"HasValue"));
}
else
{
body = Expression.Equal(
Expression.Property(xParam, "Id"),
Expression.Constant(value, typeof(long?)));
}
return Expression.Lambda<Func<T, bool>>(body, xParam);
}