Linq表达式比较属性和整数

时间:2013-06-17 12:53:08

标签: expression equality lambda

我试图比较一个对象的属性是否具有int的值。 请问如何实现呢?

int id = 123;
// Func<MyClass, bool> f = x => x.A.B.Id == id;
var a = System.Linq.Expressions.MemberExpression.Property(param, "A");
var b = System.Linq.Expressions.MemberExpression.Property(a, "B");                   

body = System.Linq.Expressions.Expression.Equal(
    System.Linq.Expressions.MemberExpression.Property(b, "Id"),
    System.Linq.Expressions.MemberExpression.Constant(id, typeof(int))
);

这会引发无效操作异常。

2 个答案:

答案 0 :(得分:1)

目前尚不清楚你做错了什么,因为你没有展示足够的代码或足够的错误。一般的方法很好。这是一个简短而完整的例子:

using System;
using System.Linq.Expressions;

public class House
{
    public Person Owner { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

class Test
{
    static void Main()
    {
        int targetLength = 3;
        var param = Expression.Parameter(typeof(House), "p");
        var a = Expression.Property(param, "Owner");
        var b = Expression.Property(a, "Name");
        var length = Expression.Property(b, "Length");

        var target = Expression.Constant(targetLength, typeof(int));

        var body = Expression.Equal(length, target);
        var lambda = Expression.Lambda<Func<House, bool>>(body, param);

        var compiled = lambda.Compile();
        var house = new House { Owner = new Person { Name = "Jon" } };
        Console.WriteLine(compiled(house));
        house.Owner.Name = "Holly";
        Console.WriteLine(compiled(house));
    }
}

我建议您查看我的代码和代码之间的区别,以找出问题所在。

答案 1 :(得分:0)

我发现了。属性ID不是Int32,而是Int16。我的错。对于其他人。在离开之前检查对象属性类型3次:)