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)
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |