【问题标题】:IQueryable Sort not workingIQueryable 排序不起作用
【发布时间】:2014-02-22 22:16:45
【问题描述】:

下面的代码在排序方面有什么问题?排序代码被命中,但排序永远不会应用于结果。

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;

【问题讨论】:

  • 你为什么在这里使用Queryable?你有一个内存集合(你正在使用ToList)那么为什么不把它保留为IEnumerable&lt;T&gt;呢?使用AsQueryable 会使事情变得更加复杂。此外,我们不知道各种变量值是什么……如果您能给我们一个简短但完整的示例来说明问题,那就更好了。
  • 我看不出有什么问题。通过删除东西来简化你的代码。你会发现它最终会起作用。罪魁祸首是你刚刚删除的内容。
  • 简单解释:orderBy 永远不会匹配你测试它的字符串。您可以使用调试器轻松找到此类错误。
  • 我使用 Queryable 是因为我可以分配我的 orderby 查询。我正在更新代码以不使用导致更多嵌套 if 的可查询。 Usr 你错了,我的 orderby 被击中了。
  • 我更新了代码,如您所见,导致代码更多。结果是一样的,Ordering 永远不会发生。

标签: linq sorting iqueryable


【解决方案1】:

OrderByOrderByDescending 不会更改调用者,而是返回新的 IQueryable/IEnuemrable。您必须将其分配回另一个(或相同)变量。否则叫他们是没有意义的。

因为您使用的是List&lt;T&gt;,所以您必须添加额外的ToList() 调用才能使其编译和工作:

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

或者您可以使用List&lt;T&gt;.Sort 代替:

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

【讨论】:

  • 这仅在更改的代码中很明显。不确定这个问题是否只存在于本题的“demo”代码中。
  • 这是正确答案.. 需要分配以及附加的 .ToList()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2013-04-07
  • 2015-05-19
  • 2012-09-20
  • 2015-06-23
相关资源
最近更新 更多