2014-02-22 99 views
0

下面的代码在排序方面有什么问题?排序代码被击中,但排序从不应用于结果。IQueryable排序不起作用

var results = new List<Location>(); 

var county = context.boc_County.Where(x => x.Description.Contains(phrase.ToLower())).ToList(); 
results.AddRange(_mapper.MapCountyFromDb(county)); 

var town = context.boc_Town.Where(x => x.Description.Contains(phrase.ToLower())).ToList(); 
results.AddRange(_mapper.MapTownFromDb(town)); 

if (orderBy == "Identifier") 
{ 
    if (direction == "ASC") 
     results = results.OrderBy(x => x.Identifier); 
    else 
     results = results.OrderByDescending(x => x.Identifier); 
} 

if (orderBy == "Type") 
{ 
    if (direction == "ASC") 
     results = results.OrderBy(x => x.LocationType.ToString()); 
    else 
     results = results.OrderByDescending(x => x.LocationType.ToString()); 
} 

if (orderBy == "Description") 
{ 
    if (direction == "ASC") 
     results = results.OrderBy(x => x.Description); 
    else 
     results = results.OrderByDescending(x => x.Description); 
} 

var model = new LocationSearchResult() 
{ 
    Locations = query.Skip(page * pageSize).Take(pageSize), 
    TotalCount = query.Count() 
}; 
return model; 
+0

if (orderBy == "Identifier") { if (direction == "ASC") results = results.OrderBy(x => x.Identifier).ToList(); else results = results.OrderByDescending(x => x.Identifier).ToList(); } // (...) 

,或者您可以使用List<T>.Sort代替“在这里呢?你有一个内存集合(你正在使用'ToList'),为什么不把它保存为'IEnumerable '?你使用'AsQueryable'使它变得更加复杂。此外,我们不知道各种变量值是什么......如果你能给我们一个简短但完整的例子来证明这个问题会好得多。 –

+0

我看不到任何错误。通过删除内容来简化您的代码。你会发现它最终工作。罪魁祸首就是你刚刚删除的东西。 – usr

+0

简单解释:'orderBy'永远不会匹配您测试的字符串。使用调试器可以轻松找到这些错误。 – usr

回答

1

OrderByOrderByDescending不改变来电者,他们返回新IQueryable/IEnuemrable代替。您必须将其分配回另一个(或相同)变量。否则称他们没有意义。

因为你使用List<T>你必须添加额外ToList()呼叫,使其编译和工作:你为什么要使用`可查询

if (orderBy == "Identifier") 
{ 
    if (direction == "ASC") 
     results.Sort((x1, x2) => x1.Compare(x2)); 
    else 
     results.Sort((x1, x2) => x2.Compare(x1)); 
} 
+0

这只是在更改后的代码中显而易见。不确定这个问题是否只存在于这个问题的“演示”代码中。 – usr

+0

这是正确的答案..需要赋值以及附加的.ToList()。 –