【发布时间】:2016-11-11 09:00:00
【问题描述】:
我的存储库方法从数据库中获取内容。它接受排序顺序作为参数:
IEnumerable<Car> getCars<TSortKey>(Expression<Func<Car, TSortKey>> sort);
我使用TSortKey,因为直到运行时我才知道将使用哪个属性,它可以是x => x.Name 或x => x.Make,它们是字符串,但也可以是x => x.History.Age,它是一个整数。
用户选择排序顺序,然后我在开关中设置排序谓词并调用该方法。
Expression<Func<Car, object>> sortPredicate;
switch (sortOption) {
case SortOption.Name: sortPredicate = s => s.Name; break;
case SortOption.Make: sortPredicate = s => s.Make; break;
case SortOption.Age: sortPredicate = s => s.History.Age; break;
default: sortPredicate = s => s.Name; break;
}
var cars = repo.getCars(sortPredicate);
我在谓词中使用object,因为直到运行时我才知道类型。但这会生成错误的 SQL,然后抛出。
那么我该如何解决这个问题?
【问题讨论】:
-
可能的解决方案:我可以将方法调用移动到每个 switch 案例中,但这会变得非常混乱。例如
case SortOption.Name: cars = repo.getCars(x=>x.Name); break; -
我很确定您可能的解决方案是最好的解决方案。另一种可能性是将您的
SortOption枚举传递到 repo 并在适当的位置构建正确的 lamda .. -
@Jamiec 是的,我现在正在做“混乱”的方式,但它变得非常混乱,因为这只是我真实代码的一小部分摘录。我希望我能以某种方式重写 lambda 以采用泛型类型。
-
您可以考虑使用反射来创建您的 Expression-Function 并创建 getCars 的通用方法并调用它。如果您需要更多帮助,我可以写一个答案。
标签: c# entity-framework linq lambda