IQueryable 排序不起作用

Rya*_*ton 1 linq sorting 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;
Run Code Online (Sandbox Code Playgroud)

Mar*_*zek 5

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

因为您正在使用,List<T>您必须添加额外的ToList()调用以使其编译和工作:

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

或者您可以List<T>.Sort改用:

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