gpt4 book ai didi

c# - 在 List 上执行 Expression ToLower 抛出异常

转载 作者:行者123 更新时间:2023-11-30 14:33:04 24 4
gpt4 key购买 nike

我有以下代码:

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,我假设是因为一些项目有一个 null 主体,但这正是 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)

最佳答案

我怀疑这是问题所在:

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

我怀疑你想要AndAlso :

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

有效地,此刻你有

x & y

如你所愿

x && y

关于c# - 在 List 上执行 Expression ToLower 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17196049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com