gri*_*iti 10 linq asp.net-mvc lambda
我们假设我有两个类:
class person
{
int ID
string name
Address address
}
class address
{
int ID
string street
string country
}
Run Code Online (Sandbox Code Playgroud)
这些类或多或少给出,它们通过nHibernate映射为诚实:)
在一个网格(datatables.net作为基础)我想有一个类型独立的排序.
因此我创建了一个lambda表达式:
var param = Expression.Parameter(typeof(T), typeof(T).Name);
var sortExpression = Expression.Lambda<Func<T, object>>
(Expression.Convert(Expression.Property(param, "Property to sort"), typeof(object)), param);
Run Code Online (Sandbox Code Playgroud)
如果我将Person作为类型T传递并用"name"替换"要排序的属性",它可以正常工作(创建一个正确的lambda).如果要排序的属性是"address.street"它将无法正常工作,抛出以下错误:
Property 'address.street' is not defined for type 'person'
Run Code Online (Sandbox Code Playgroud)
到目前为止我只看到一个解决方案,但不够清楚...我会尝试拆分包含Property-Name的字符串(拆分.)
谁能提供更好的解决方案?我需要将sortExpression添加到IQueryable对象query.OrderBy(sortExpression).
不确定我的标题是否清楚,请继续并更正.
提前致谢.
Luk*_*Led 12
什么不清楚?
你必须拆分然后使用:
Expression.Property(Expression.Property(param, "address"), "street")
Run Code Online (Sandbox Code Playgroud)
这是 LukLed 答案的更通用版本:
protected MemberExpression NestedExpressionProperty(Expression expression, string propertyName)
{
string[] parts = propertyName.Split('.');
int partsL = parts.Length;
return (partsL > 1)
?
Expression.Property(
NestedExpressionProperty(
expression,
parts.Take(partsL - 1)
.Aggregate((a, i) => a + "." + i)
),
parts[partsL - 1])
:
Expression.Property(expression, propertyName);
}
Run Code Online (Sandbox Code Playgroud)
你可以这样使用它:
var paramExpression = Expression.Parameter(this.type, "val");
var firstProp = NestedExpressionProperty(paramExpression,"address.street");
Run Code Online (Sandbox Code Playgroud)
在我看来,您正在尝试重写Microsoft DynamicQuery。为什么不直接使用它呢?
这是一个例子:
IQueryable<Foo> myQuery = GetHibernateQuery();
myQuery = myQuery.OrderBy("address.street");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6659 次 |
| 最近记录: |