动态LINQ是否仍在使用,适合缩小搜索结果?

Cic*_*ami 2 linq filtering dynamic-linq asp.net-mvc-3

我正在用C#开发一个ASP.NET MVC3应用程序.

我试图在我的应用程序中实现一个"缩小"功能应用从搜索获得的结果集.

简而言之,在我执行搜索并将结果显示在页面的中心之后,我希望在页面的左/右侧CheckBoxList为搜索结果的每个属性提供帮助.的CheckBox每一个CheckBoxList代表不同的值的属性.

例如,如果我搜索Product它并且它具有Color值为蓝色,红色黄色的属性,我创建一个CheckBoxList带有文本颜色CheckBox每个颜色三个一个.

在对Web进行研究后,我发现Scott Guthrie提供了这个动态LINQ库.由于我发现最近的一个示例/教程是从2009年开始,我想知道这个库是否真的很好(和维护).

在后一种情况下,jQuery是实现此类功能的最佳方式吗?

小智 5

您可以使用纯.NET框架动态构建所需的谓词表达式来解决它.

请参阅下面的代码示例 根据条件,这将过滤多个属性.我已经使用了IQuerable,因为这将使In-Memory成为远程场景,例如Entity Framework.如果你要使用Entity Framework,你也可以动态构建一个EntitySQL字符串.我希望这会表现得更好.

涉及一小部分反射(GetProperty).但是这可以通过在BuildPredicate方法中执行缓存来改进.

public class Item
{
    public string Color { get; set; }
    public int Value { get; set; }
    public string Category { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var list = new List<Item>()
        {
            new Item (){ Category = "Big", Color = "Blue", Value = 5 },
            new Item (){ Category = "Small", Color = "Red", Value = 5 },
            new Item (){ Category = "Big", Color = "Green", Value = 6 },
        };

        var criteria = new Dictionary<string, object>();
        criteria["Category"] = "Big";
        criteria["Value"] = 5;

        var query = DoDynamicWhere(list.AsQueryable(), criteria);
        var result = query.ToList();
    }

    static IQueryable<T> DoDynamicWhere<T>(IQueryable<T> list, Dictionary<string, object> criteria)
    {
        var temp = list;

        //create a predicate for each supplied criterium and filter on it.
        foreach (var key in criteria.Keys)
        {
            temp = temp.Where(BuildPredicate<T>(key, criteria[key]));
        }

        return temp;
    }

    //Create i.<prop> == <value> dynamically
    static Expression<Func<TType, bool>> BuildPredicate<TType>(string property, object value)
    {
        var itemParameter = Expression.Parameter(typeof(TType), "i");

        var expression = Expression.Lambda<Func<TType, bool>>(
            Expression.Equal(
                Expression.MakeMemberAccess(
                    itemParameter,
                    typeof(TType).GetProperty(property)),
                Expression.Constant(value)
            ),
            itemParameter);

        return expression;
    }
}
Run Code Online (Sandbox Code Playgroud)