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[,]
- 首先将模型与查询分开class。
- 然后像下面的代码那样在视图模型中执行 Select。
- 此外,这真的是“详细信息”查询吗?也许您应该将其重命名为“Index”,因为它正在返回一个列表。
- 您可能希望在您的视图模型中将
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;
}
}
我正在从数据库中获取行列表(我将其传回我的控制器,然后在视图中使用 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[,]
- 首先将模型与查询分开class。
- 然后像下面的代码那样在视图模型中执行 Select。
- 此外,这真的是“详细信息”查询吗?也许您应该将其重命名为“Index”,因为它正在返回一个列表。
- 您可能希望在您的视图模型中将
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;
}
}