2013-06-19 54 views
3

我有下面的代码:执行ToLower将上表表达式抛出异常

public Expression FilterString(string property, string value, ParameterExpression parameter) 
{ 
    //Create Message MemberExpression from parameter and properted eg/Message.Body 
    var getname = Expression.Property(parameter, property); 

    //Create expression for Not IsNullOrEmpty 
    var isnullorempty = Expression.Not(Expression.Call(typeof(string), "IsNullOrEmpty", null, getname)); 

    //Create expression for member property equal to value eg/Message.Body = "hi" 
    var toLower = Expression.Call(getname, 
         typeof(string).GetMethod("ToLower", System.Type.EmptyTypes)); 
    var compare = Expression.Equal(toLower, Expression.Constant(value)); 

    //Create expression combining Not IsNullOrEmpty AND Equal To 
    var condition = Expression.And(isnullorempty, compare); 

    return condition; 
} 

如果我运行下面的测试中,我得到一个NullReferenceException,我想是因为一些项目有一个空的身体,但正是那Expression应该正在测试。

private IEnumerable<Message> GetMessages() 
{ 
    var list = new List<Message>(); 

    var message = new Message() { Body = null, Properties = new Collection<MessageProperty>() }; 
    list.Add(message); 

    message = new Message() { Body = "", Properties = new Collection<MessageProperty>() }; 
    list.Add(message); 

    message = new Message() { Body = "Hello Everybody", Properties = new Collection<MessageProperty>() }; 
    list.Add(message); 

    message = new Message() { Flag = 1, Properties = new Collection<MessageProperty>() }; 
    list.Add(message); 

    message = new Message() { ChannelInt = 1, Properties = new Collection<MessageProperty>() }; 
    list.Add(message); 

    message = new Message() { Properties = new Collection<MessageProperty>(new[] { new MessageProperty() { Key = "Gender", Value = "male" } }) }; 
    list.Add(message); 

    return list; 
} 

[Theory] 
[InlineData("Hello Everybody")] 
[InlineData("hello everybody")] 
public void FilterString_NullAndEmptyMessages_Removed(string searchTerm) 
{ 
    var messageList = GetMessages(); 

    var parameter = Expression.Parameter(typeof(Message), "message"); 

    var equalToFilterType = new EqualToFilterType(); 

    var filter = equalToFilterType.FilterString("Body", searchTerm, parameter); 

    var lambda = Expression.Lambda(filter, parameter); 

    //******EXCEPTION*******// 
    var result = messageList.AsQueryable().Where((Expression<Func<Message, bool>>)lambda).ToList(); 

    Assert.Equal(1, result.Count); 
} 

任何想法如何让这个测试通过? (我表达的代码将被用来打的SQL Server太BTW)

+0

如果我的回答对你不起作用,如果你将它包装成一个简短但完整的控制台应用程序,我们可以为自己测试,这将非常有帮助。 –

回答

6

我怀疑这就是问题所在:

var condition = Expression.And(isnullorempty, compare); 

我怀疑你想AndAlso

var condition = Expression.AndAlso(isnullorempty, compare); 

有效,此刻你有

x & y 

,而你想

x && y 
+0

好的。按位&会执行两个语句,而&&会根据需要短路。 – Haney