Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Linq表达式引发InvalidOperationException_.net_Linq_Nhibernate_Lambda_Linq Expressions - Fatal编程技术网

.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);
}