实体框架排序列表<MyClass>



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

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类的底部尝试了mainList.OrderByDescending(p => p.PostedDateTime);的变体。但我总是犯各种各样的错误。

在获取值之前,我也尝试过对DB表(而不是我的列表(进行排序,但尽管我在谷歌上搜索了一下,我还是弄不清楚,实体框架文档似乎比我需要做的更复杂。下面插入到GetCardDetails类顶部的内容不会引发错误,但不会做任何事情,也不会对DB表进行任何更改。

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

我也不确定这里的"最佳实践"是什么。对列表进行排序或在创建列表之前对表进行排序。我想对清单进行排序会更有效率。

有人能帮我如何按PostedDateTime列对列表进行排序吗?

此代码不执行任何操作:

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

对值进行排序,但随后忽略该排序的结果;保存";对数据库的更改,但您没有更改任何内容,因此没有可保存的内容。对一组结果进行排序并不是对数据的更改。

如果GetDetails应按特定顺序返回其列表,则按以下顺序返回:

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

或者,如果您想在读取DB表之前对其进行排序,请将排序后的查询存储在变量中,并将其用于表访问。例如:

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

无论你在哪里访问表格:

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

顺便说一句,我强烈怀疑这种整体方法在查询数据方面非常低效。但我对数据或方法的意图一无所知,所以我再具体不过了。但通常情况下,您可以可能构建一个表达式树来查询数据库,包括您需要的任何排序和投影,并在需要时返回IEnumerable<SomeModel>作为要评估的表达式树。但这些细节可能会随着你的不断学习而演变。

  1. 首先将模型与查询类分离
  2. 然后像下面的代码一样对视图模型进行选择
  3. 此外,这真的是一个";细节";查询也许您应该将其重命名为";索引";因为它正在返回一个列表
  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;
    }
}

您必须执行mainList.OrderByDescending(p => p.Column4PDT).ToList();,因为根据我记忆中的orderbydescending返回一个整数,此外,您的类在发布时没有您想要排序的变量

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

顺便说一句。您在哪里定义行的类型(string[,](rows = new string[,]

相关内容

最新更新