where子句的动态lambda表达式

时间:2017-01-13 19:38:29

标签: c# dynamic lambda dynamic-linq

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

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

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

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

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

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

我想要实际检查的是列表中的项目是否具有特定字符串值而不是空白空格。我尝试了以下代码

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

它引发了错误

  

类型'System.Func`2 [DynamicType,System.Object]'的表达式不能   用于方法'Boolean的'System.String'类型的参数   IsNullOrWhiteSpace(System.String)'

虽然我通过以下查询成功获得结果

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

看看System.Linq.Dynamic,有一个很棒的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;
    }
}

答案 2 :(得分:0)

使用你的表达式没问题 - 它运行正常。

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

  

类型'System.Func`2 [DynamicType,System.Object]'的表达式不能   用于方法'Boolean的'System.String'类型的参数   IsNullOrWhiteSpace(System.String)'

所以看一下这个错误,就是说明了(移动订单):

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

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

最后,什么是

  

'动态项目列表'?

您使用的是Dynamic,还是正常List<Item>