早上好,
我有以下代码行:
var viewModel = new ClassifiedsBrowseViewModel
{
Category = categoryModel,
Listings = categoryModel.Listings.OrderBy(c => c.Price).ToList()
};
世界上一切都很好,这段代码运行良好。但是现在我想添加一个switch语句,允许我更改我订购列表的内容(在上面的代码中按价格排序)。
所以我显然不能在新模型减速中使用switch语句,所以我将把switch语句放在上面例如:
switch(searchCriteria)
{
case "Price":
break;
case default:
break;
}
所以我的问题是如何将这两者联系起来? BTW列表在ViewModel中声明为:
public List<Listing> Listings { get; set; }
我以为我可以在Controller中声明一个Listings变量,然后在Switch中将该变量设置为categoryModel.Listings.OrderBy(c =&gt; c。 [Search Criteria] )。ToList( )然后简单地有Listings = Listings?
非常感谢, Ĵ
使用
使用Ribon的方法:
var viewModel = new ClassifiedsBrowseViewModel
{
Category = categoryModel,
Listings = categoryModel.Listings.OrderBy(c =>
{
switch (searchCriteria)
{
case "Price": return c.Price;
case "FuelType": return c.FuelType;
default: return c.Price;
}
}).ToList()
};
答案 0 :(得分:1)
我对Linq的陈述一无所知,你不能这样做吗?
var viewModel = new ClassifiedsBrowseViewModel
{
Category = categoryModel,
Listings = categoryModel.Listings.OrderBy(c => {
switch (searchCriteria) {
case "Price" : return c.Price; break;
default: return c; break;
}
}).ToList()
};
答案 1 :(得分:1)
您可以在switch语句中使用linq语句,例如
switch(searchCriteria)
{
case "Price":
viewModel.Listings = categoryModel.Listings.OrderBy(c => c.Price).ToList()
break;
case default:
viewModel.Listings = categoryModel.Listings.OrderBy(c => c.SomeOtherField).ToList()
break;
}
答案 2 :(得分:1)
我会:
IEnumerable<Foo> listings = categoryModel.Listings;
switch(sortOrder) {
case "x":
listings = listings.OrderBy(l => l.Something);
break;
case "y":
listings = listings.OrderBy(l => l.Whatever);
break;
}
然后在模型创建中使用listing变量:
...
Listings = listings
...
(或listings.ToList())
答案 3 :(得分:1)
IMO一个漂亮,干净且可读的解决方案是创建一个接受IQueryable的扩展方法,以及一个代表各种排序选项的枚举。
public static IOrderedQueryable<Listing> WithListingOrder(this IQueryable<Listing> source, PriceOrderingOptions orderBy)
{
switch (orderBy)
{
case ListingOrderingOptions.Price:
return source.OrderBy(x => x.Price);
... // other enumerations
}
}
我有一个通用的排序扩展方法(采用T,TKey),但在你的情况下,因为你使用字符串(搜索条件),不能在这里使用泛型。
但我认为将排序选项表示为枚举可以防止“魔术字符串”。
并像这样使用它:
var searchCritera = ListingOrderingOptions.Price;
var viewModel = new ClassifiedsBrowseViewModel
{
Category = categoryModel,
Listings = categoryModel.Listings.WithListingOrder(searchCriteria)
}).ToList()
};
这里的主要好处是你的隐藏扩展后面的丑陋开关 - 这里的目标是保持你的控制器清洁。