动态Linq期望的'Boolean'类型的表达式

时间:2016-06-29 08:35:57

标签: c# linq kendo-ui kendo-asp.net-mvc

我在ASP.NET MVC中使用了Kendo Grid,我创建了一个这样的自定义服务器端过滤器:

public string CreateString(IEnumerable<IFilterDescriptor> filters, string defaultFilter)
{
    StringBuilder builder = new StringBuilder();
    if (filters == null || filters.Count() == 0)
    {
        _filterstring = defaultFilter;
        return _filterstring;
    }
    if (filters.Any())
    {
        foreach (Kendo.Mvc.FilterDescriptor filter in filters)
        {
            string template = Templates[filter.Operator.ToString().ToLower()];
            builder.AppendFormat(template, filter.Member, filter.Value);
        }
    }
    _filterstring = builder.ToString();

    return _filterstring;
}

private static readonly IDictionary<string, string> Templates = new Dictionary<string, string>
{
    { "eq", "{0} = '{1}'" },
    { "neq", "{0} <> '{1}'" },
    { "lt", "{0} < '{1}'" },
    { "lte", "{0} <= '{1}'" },
    { "gt", "{0} > '{1}'" },
    { "gte", "{0} >= '{1}'" },
    { "startswith", "{0} like '{1}*'" },
    { "endswith", "{0} like '*{1}'" },
    { "contains", "{0} like '*{1}*'" },
    { "doesnotcontain", "{0} not like '*{1}*'" }
};

这样会返回string

Title like '*a*'

我使用Linq.Dynamic并过滤数据集,如:

var articleCategories = _articleCategories.AsQueryable();
    if (!string.IsNullOrEmpty(filter))
        articleCategories = articleCategories.Where(filter).ToList();

但它会返回此错误:

  

预期类型'Boolean'的表达式。

1 个答案:

答案 0 :(得分:1)

我对这些并不是很好,但您可能缺少过滤器之间的逻辑and?我在你的代码中添加了一个,但我对此并不是很好。告诉我它是否有效。

if (filters == null || filters.Count() == 0)
{
    _filterstring = defaultFilter;
    return _filterstring;
}
if (filters.Any())
{
    string template = Templates[filters[0].Operator.ToString().ToLower()];
    builder.AppendFormat(template, filter.Member, filter.Value);
    if (filters.Count() > 1) {
        foreach (Kendo.Mvc.FilterDescriptor filter in filters.Skip(1))
        {
            template = " && " + Templates[filter.Operator.ToString().ToLower()];
            builder.AppendFormat(template, filter.Member, filter.Value);
        }
    }
}