当var用于方法中的不同事物时如何初始化var

How to initialize var when it is used for different things in a method

我的控制器中有一个方法根据提交的数据执行一些逻辑,我的 var项目应该分配给不同的结果?

例如我的控制器的方法是这样的:

public ActionResult Index(SearchCriteria criteria)
{
    var db = new EbuyDataEntities();

    //criteria.SearchKeyword = "movie";
    if (!string.IsNullOrEmpty(criteria.SearchKeyword))
    {
       var auctionData = db.Auctions.First(q => q.Description.Contains(criteria.SearchKeyword));
    }
    else
    {
        var auctionData = db.Auctions.OrderBy(item => item.EndTime);
    }

    switch (criteria.GetSortByField())
    {
        case SearchCriteria.SearchFieldType.Price:
            auctionData = auctionData.OrderBy(q => q.CurrentPrice.Value);
            break;
        case SearchCriteria.SearchFieldType.RemainingTime:
            auctionData = auctionData.OrderBy(q => q.EndTime);
            break;
        case SearchCriteria.SearchFieldType.Keyword:
        default:
            auctionData = auctionData.OrderBy(q => q.Title);
            break;
    }

    auctionData = SomeMethod();
    var viewModel = new SearchViewModel();

    return View("Search",viewModel);
}

做这样的事情的正确方法是什么。

好吧,两个选择:

  • 将声明移到 if 语句之前,并为其指定显式类型:

    IQueryable<Auction> auctionData;
    if (...)
    {
        ...
    }
    else
    {
        ...
    }
    
  • 将结构更改为只有一个声明,例如使用条件运算符:

    var auctionData = !string.IsNullOrEmpty(criteria.SearchKeyword)
        ? db.Auctions.Where(q => q.Description.Contains(criteria.SearchKeyword))
        : db.Auctions.OrderBy(item => item.EndTime);
    

请注意,我已将此处的 First 更改为 Where - 否则您只会匹配一个 单个 条目,这听起来不像对我来说是一个很大的搜索,并且会使该方法的其余部分变得非常奇怪。

这本身就暗示了第三种选择:

var auctionData = db.Auctions.OrderBy(item => item.EndTime);
var keyword = criteria.SearchKeyword;
if (!string.IsNullOrEmpty(keyword))
{
    auctionData = auctionData.Where((q => q.Description.Contains(keyword));
}