如何使用模型的属性搜索数据库

时间:2014-02-11 18:27:16

标签: c# asp.net-mvc-4 lambda

我有一个MVC4程序,其中有一个下拉列表,其中包含模型的所有属性列表。我希望用户能够选择哪个属性然后在字符串值中键入要搜索的文本框。问题是我无法使用下拉列表的值动态更改查询。

public ActionResult SearchIndex(string searchString, string searchFields)
    {
        var selectListItems = new List<SelectListItem>();
        var first = db.BloodStored.First();
        foreach(var item in first.GetType().GetProperties())
        {
            selectListItems.Add(new SelectListItem(){ Text = item.Name, Value = item.Name});
        }
        IEnumerable<SelectListItem> enumSelectList = selectListItems;
        ViewBag.SearchFields = enumSelectList;

        var bloodSearch = from m in db.BloodStored
                          select m;

        if (!String.IsNullOrEmpty(searchString))
        {
            PropertyInfo selectedSearchField = getType(searchFields);
            string fieldName = selectedSearchField.Name;

            //Dynamic Linq query this is how it needs to be set up to pass through linq.dynamic without exception
            bloodSearch = bloodSearch.Where("x => x." + fieldName + " == " + "@0", searchString).OrderBy("x => x." + fieldName);
            return View(bloodSearch); 
        }
        return View(bloodSearch);
    }

这是我的getType方法

public PropertyInfo getType(string searchFields)
    {
        var first = db.BloodStored.First();
        foreach (var item in first.GetType().GetProperties())
        {
            if(searchFields == item.Name)
            {
                return item;
            }
        }
        return null;
    }

我已更新我的代码以反映可以帮助其他人的工作查询包装。 这是我从Dynamic query with LINQ won't work

找到答案的帖子的链接

2 个答案:

答案 0 :(得分:1)

您应该使用Dynamic.cs库。你可以在这里找到它以及例子。然后,您可以动态创建where子句。

dynamic.cs

答案 1 :(得分:0)

你可以自己构建表达式。

static Expression<Func<T, bool>> GetExpression<T>(string propertyName, string propertyValue)
{
    var parameterExp = Expression.Parameter(typeof(T), "type");
    var propertyExp = Expression.Property(parameterExp, propertyName);
    MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
    var someValue = Expression.Constant(propertyValue, typeof(string));
    var containsMethodExp = Expression.Call(propertyExp, method, someValue);

    return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
}

从Marc Gravell的帖子中偷走了这个。