where 子句的动态 lambda 表达式

Dynamic lambda expression for where clause

我有一个动态对象列表,我在其中使用 lambda 表达式 where 子句来过滤项目。例如,只考虑它有 3 个属性,foo、bar 和 baz

class item // let this be current class in dynamic item list
{
    bool foo;
    string bar;
    string baz;
}

现在,如果我想过滤 foo 为假的项目列表,我可以使用以下表达式

var filtered = itemList.Where("!foo");

我什至可以按字符串值过滤列表

var filtered = itemList.Where("bar==\"value\""); \all items with bar = value

我真正想检查的是列表中的项目是否具有特定的字符串值而不是白色 space。我尝试了以下代码

var filtered = itemList.Where("!String.IsNullOrWhiteSpace(baz)");

它抛出了一个错误

Expression of type 'System.Func`2[DynamicType,System.Object]' cannot be used for parameter of type 'System.String' of method 'Boolean IsNullOrWhiteSpace(System.String)'

虽然我通过查询成功得到了结果

var filtered = itemList.Where("baz!=null && baz!=\"\"");

我想确认我是否可以在此查询中使用 String.IsNullOrWhiteSpace()

您可以将“!String.IsNullOrWhiteSpace(baz)”替换为“!(baz == null || baz.Trim() == string.Empty)”,它应该可以工作。

看看System.Linq.Dynamic, there is a great example here

您还需要确保 List<T> 不是 List<object>,否则 System.Linq.Dynamic 将无法找到属性。

这是您的示例的片段:

void Main()
{
    var itemList = new List<dynamic>{ new {foo = true, bar = "a", baz = "b" }, new {foo = true, bar = (string)null, baz = "d" } };
    var filtered = itemList.ToAnonymousList().Where("bar != null and bar !=\"\"");
    filtered.Dump();
}

public static class EnumerableEx {
    public static IList ToAnonymousList(this IEnumerable enumerable)
    {
        var enumerator = enumerable.GetEnumerator();
        if (!enumerator.MoveNext())
            throw new Exception("?? No elements??");

        var value = enumerator.Current;
        var returnList = (IList) typeof (List<>)
            .MakeGenericType(value.GetType())
            .GetConstructor(Type.EmptyTypes)
            .Invoke(null);

        returnList.Add(value);

        while (enumerator.MoveNext())
            returnList.Add(enumerator.Current);

        return returnList;
    }
}

我使用你的表达没问题 - 它工作正常。

我已经将它与对象和实体一起用于 EF 存储。

Expression of type 'System.Func`2[DynamicType,System.Object]' cannot be used for parameter of type 'System.String' of method 'Boolean IsNullOrWhiteSpace(System.String)'

因此查看错误,它指出(移动顺序):

方法 IsNullOrWhiteSpace,即 returns 一个 Boolean,需要类型为 System.String 的参数。 但是收到的是Expression of type System.Func``2[DynamicType,System.Object]'

您可能引用了一个对象而不是字符串值来进行比较。但是,如果没有您正在使用的对象的示例代码,无论您是使用对象、实体还是 LinQ to SQL(我还没有尝试过),我们只能猜测您为表达式提供的内容。

最后,什么是

'dynamic item list'?

您使用的是 Dynamic,还是普通的 List<Item>