我正在尝试构建一个函数来根据某些参数动态生成不同的查询。我对 LINQ 语法有点困惑,不确定我是否做对了。
字符串类型参数集是“search”(用于搜索文本框值)、“searchfield”(搜索内容)、“limit_begin”、“limit_end”用于表示行数和从何处开始。 “order_by”表示按哪个字段排序。 “order_sort”用于排序的方式。
我之前在 stackoverflow 上发现了这个“getpropertyvalue”反射函数,我希望它能够根据我自己的解释实现我的意图。
private static object GetPropertyValue(object obj, string property)
{
System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
return propertyInfo.GetValue(obj, null);
}
if (order_sort == "ASC")
{
(from a in entities.UserTable
where GetPropertyValue(a, searchfield).ToString().Contains(search)
select a)
.OrderBy("a." + order_by)
.Skip(Convert.ToInt32(limit_begin))
.Take(Convert.ToInt32(limit_end))
.ToList();
}
else if (order_sort == "DESC")
{
(from a in entities.UserTable
where GetPropertyValue(a, searchfield).ToString().Contains(search)
select a)
.OrderByDescending("a." + order_by)
.Skip(Convert.ToInt32(limit_begin))
.Take(Convert.ToInt32(limit_end))
.ToList();
}
我在“Orderby”行收到错误,VS2008 用红色突出显示它,表示无法从用法推断参数类型。
The .OrderBy
and .OrderByDescending
方法需要类型参数Func<T, TKey>
并且你正在传递一个字符串。基本上,它要求您提供一个表达式,它可以用来识别您想要排序的属性。由于您必须从字符串开始,因此我最好的想法是在 OrderBy 中使用反射。
.OrderBy(x => x.GetType().GetProperty(order_by).GetValue(x, null).ToString())
正如您所看到的,这不是很容易阅读,但应该可以解决问题。您还可以查看 LINQ 动态查询库:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx.
希望这可以帮助! :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)