【发布时间】:2014-03-06 14:30:44
【问题描述】:
(我已将所有代码简化为只有特定问题)
我创建了几个不同的服务方法,它们接受一个排序表达式,我想在 order by 语句中使用它们。
2个版本如下:
public List<Order> GetOrders(Expression<Func<Order, object>> sortExpression)
{
// get the query for the orders table
IQueryable<Order> query = GetQuery();
// order by based on the passed in expression
query = query.OrderBy(sortExpression);
// now execute the query and return the collection
return query.ToList();
}
public List<Order> GetOrders2(Func<IQueryable<Order>, IOrderedQueryable<Order>> orderby)
{
IQueryable<Order> dbQuery = GetQuery();
if (orderby != null)
{
dbQuery = orderby(dbQuery);
}
return dbQuery.ToList();
}
我打电话给他们:
GetOrders(o => o.CreatedOnDate);
GetOrders2(queryable => queryable.OrderBy(o => o.CreatedOnDate));
如果我只传入某些类型,第一种方法可以正常工作。如果我传入 DateTime 或 Nullable 类型,那么它会抛出一个异常,它不能将这些类型转换为 object。
如果我传入一个排序表达式,则第二种方法可以正常工作。但是,如果我尝试传入一个集合(或参数),我可以让它工作的唯一方法基本上是最后一个排序顺序覆盖前一个。
我将如何更改其中一个以使其接受多个排序表达式,它处理OrderBy 和ThenBy,并且适用于所有类型?
【问题讨论】:
-
考虑到您的示例似乎提供了
Func<Order, DateTime>,但您的方法采用Func<IQueryable<Order>, IOrderedQueryable<Order>>类型的参数,即使编译了我也会感到惊讶 -
这里是否缺少
GetOrders重载? -
啊,我需要回到那个方法。我有几个不同的版本,尝试了很多不同的东西,并在我赶去开会时发布!我会更新这个问题:S
-
问题已更新,是的,缺少重载:S
标签: c# .net linq entity-framework