我正在从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>
作为要评估的表达式树。但这些细节可能会随着你的不断学习而演变。
- 首先将模型与查询类分离
- 然后像下面的代码一样对视图模型进行选择
- 此外,这真的是一个";细节";查询也许您应该将其重命名为";索引";因为它正在返回一个列表
- 您可能希望在视图模型中将
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[,]