我的存儲庫方法從數據庫中提取東西。它接受的排序順序作爲參數:如何指定謂詞的類型,直到運行時我纔會知道?
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,並拋出。
那麼我該如何解決這個問題?
可能的解決方案:我可以將方法調用到每個開關的情況下,但變得非常混亂。例如'case SortOption.Name:cars = repo.getCars(x => x.Name); break;' – grokky
我很確定你的可能解決方案是最好的。另一種可能性就是將你的'SortOption'枚舉傳入回購並構建正確的lamda .. – Jamiec
@Jamiec是的我現在正在做「雜亂」的方式,但它變得非常混亂,因爲這只是一小段摘錄我的真實代碼。我希望我能以某種方式重寫lambda來代替泛型。 – grokky