【发布时间】:2012-11-12 10:44:47
【问题描述】:
我正在尝试将 Web 网格助手与通用存储库结合使用来添加列排序。带有网格助手的视图的操作结果具有用于排序列(字符串)的参数。在我的通用方法签名中,我需要根据域模型的属性名称传入一个 lambda 表达式(见下文)。
public IEnumerable<T>GetAllPagingAndSorting<TKey>(out int totalRecords,
int pageSize, int pageIndex, Expression<Func<T, TKey>> orderingKey,
SortDirection sortOrder,
params Expression<Func<T, object>>[] includes)
{}
例如,我想将属性名称“Name”和“string”类型映射到 m=>m.Name。
我曾尝试按以下方式使用字典,但在调用存储库方法时会引发错误,因为类型现在是对象而不是 int、string 等......
private IDictionary<string,Expression<Func<MyModel,object>>> _orderings =
new Dictionary<string, Expression<Func<MyModel,object>>>
{
{"Id",(m=>m.Id)},
{"Name",m=>m.UserName},
{"DateRequired",m=>m.DateRequired},
{"AssignedTo",m=>m.TeamMember.MemberName},
{"RequestedBy",m=>m.RequestedBy},
};
我应该改用一种方法吗?在任何一种情况下,我如何使用上述内容来匹配输入属性并返回具有正确类型的 Lambda 表达式?
更新: 这是我在控制器中的操作....我想我会尝试在此处获取 Lambda 的排序密钥,因为我使用通用存储库....
定义的通用存储库方法: IEnumerable GetAllPagingAndSorting(out int totalRecords, int pageSize, int pageIndex,Expression> orderingKey, SortDirection sortOrder, params Expression>[] 包括);
public ActionResult ServerPagingAndSorting(int page = 1, string sort = "Id", string sortDir = "Ascending")
{
int totalRecords;
var viewModel =new SupportRequestsIndexVM(supportrequestRepository.GetAllPagingAndSorting(out totalRecords, PageSize,page - 1,_orderings[sort] ,GetSortDirection(sortDir),(m=>m.TeamMember)))
{PageSize = PageSize, PageNumber = page, TotalRows = totalRecords};
return View(viewModel);
}
【问题讨论】:
-
抱歉,我已经更新了问题......
-
您能否编辑您的问题并显示您用于获取相关订购的代码并致电
GetAllPagingAndSorting<TKey>? -
@Euston 在这种情况下,您的 TKey 很可能必须实现 IComparable,因此在没有看到更多结构的情况下,我建议在字典定义中更改 Object -> IComparable,看看它是否仍然抛出错误
-
@Nicholas Butler /user1793607 - 我添加了更多代码,希望能显示我想要尝试的内容。我将如何使用 IComparable 而不是 Object?
标签: c# linq generics lambda expression