Entity Framework 排序列表<MyClass>

Entity Framework Sort List<MyClass>

我正在从数据库中获取行列表(我将其传回我的控制器,然后在视图中使用 Razor 语法进行处理),但我无法按特定的数据库列对列表进行排序。

public class GetTableDetails
{

    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
    public string Column4PDT { get; set; }
    public string Column5 { get; set; }

    public static List<GetTableDetails> GetDetails(ApplicationDbContext _context)
    {

        var tableEntriesCount = _context.TableName.Count();
        var Table = _context.TableName.FirstOrDefault();
        string[,] table = { };

        List<GetTableDetails> mainList = new List<GetTableDetails>();

        List<string> column1List = _context.TableName.Where(c => c.Column1Title != null).Select(c => c.Column1Title).ToList();
        List<string> column2List = _context.TableName.Where(c => c.Column2Title!= null).Select(c => c.Column2Title).ToList();
        List<string> column3List = _context.TableName.Where(c => c.Column3Title!= null).Select(c => c.Column3Title).ToList();
        List<DateTime> postedDateTimeList = _context.TableName.Where(c => c.PostedDateTime != null).Select(c => c.PostedDateTime.Value).ToList();
        List<string> column5List = _context.TableName.Where(c => c.Column5Title!= null).Select(c => c.Column5Title).ToList();

        for (int i = 0; i < tableEntriesCount; i++)
        {
            rows = new string[,] { { column1List[i], column2List[i], column3List[i], postedDateTimeList[i].ToString(), column5List[i] } };

            mainList.Add(new GetTableDetails() { Column1 = rows[0, 0], Column2 = rows[0, 1], Column3 = rows[0, 2], Column4PDT = rows[0, 3], Column5 = rows[0, 4] });
        }

        return mainList;

    }
}

在返回列表之前,我在 GetCardDetails class 的底部尝试了 mainList.OrderByDescending(p => p.PostedDateTime); 的变体。但是我不断收到各种错误。

我也曾尝试在获取值之前对 DB table(而不是我的列表)进行排序,但是尽管拖网 Google 我无法弄清楚,实体框架文档似乎比什么更复杂我需要去做。下面插入 GetCardDetails class 的顶部不会引发错误,但不会执行任何操作并且不会对数据库 table.

应用任何更改
_context.TableName.OrderByDescending(p => p.PostedDateTime);
_context.SaveChangesAsync();

我也不确定这里的 'best practice' 是什么。在创建列表之前对列表进行排序或对 table 进行排序。我认为对列表进行排序会更有效率。

任何人都可以帮助我如何按 PostedDateTime 列对列表进行排序吗?

此代码不执行任何操作:

_context.TableName.OrderByDescending(p => p.PostedDateTime);
_context.SaveChangesAsync();

确实 对值进行排序,但随后忽略了那种排序的结果。 (您不将 returned 结果存储在任何内容中。)然后它将更改“保存”到数据库,但您没有更改任何内容,因此没有任何内容可保存。对一组结果进行排序不是对数据的更改。

如果 GetDetails 应该 return 它的列表以特定的顺序排列,return 它的顺序是:

return mainList.OrderByDescending(p => p.SomeField).ToList();

或者,如果您想在完全阅读之前对数据库 table 进行排序,请将排序的查询存储在一个变量中并将其用于您的 table 访问。例如:

var table = _context.TableName.OrderByDescending(p => p.PostedDateTime);

以及您访问 table 的任何地方:

List<string> column1List = table.Where(c => c.Column1Title != null).Select(c => c.Column1Title).ToList();
//                         ^--- here

顺便说一句,我强烈怀疑这种整体方法在查询数据时非常效率低下。但我对数据或方法的意图一无所知,所以我真的不能比这更具体了。但一般来说,你可以可能构建一个表达式树来查询数据库,包括你需要的任何排序和投影,以及return一个IEnumerable<SomeModel>作为表达式树在需要时进行评估。但随着您继续学习,这些细节可能会发生变化。

你必须做 mainList.OrderByDescending(p => p.Column4PDT).ToList(); 因为我记得 orderbydescending returns 一个 ienumerator 并且你的 class 没有你想要在你的 post

中排序的变量

目前无法检查,但应该可以

顺便说一句。你在哪里定义行的类型(字符串[,]) rows = new string[,]

  1. 首先将模型与查询分开class。
  2. 然后像下面的代码那样在视图模型中执行 Select。
  3. 此外,这真的是“详细信息”查询吗?也许您应该将其重命名为“Index”,因为它正在返回一个列表。
  4. 您可能希望在您的视图模型中将 Column4PDT 更改为 DateTime

代码:

public class TableDetailsViewModel
{
    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
    public DateTime Column4PDT { get; set; }
    public string Column5 { get; set; }
}
public class TableDetailsQuery
{
    private readonly ApplicationDbContext _context;
    public TableDetailsQuery(ApplicationDbContext context)
    {
        _context = context;
    }
    public List<TableDetailsViewModel> GetDetails()
    {
        var viewModel = _context.TableName
            .Select(x => new TableDetailsViewModel {
                Column1 = x.Column1Title,
                Column2 = x.Column2Title,
                Column3 = x.Column3Title,
                Column4PDT = x.PostedDateTime,
                Column5 = x.Column5Title,
            })
            .OrderByDescending(p => p.PostedDateTime)
            .ToList();

        return viewModel;
    }
}