我有一个来自数据库的列表,想要对该列表中的
DateofCreation
变量进行排序。它的数据类型是字符串。
我该怎么办?
我按照本网站此处
中的指示进行操作并修改它以适合我的代码,错误是
Error CS0834 A lambda expression with a statement body cannot be converted to an expression tree
var orderedList3 = collectionRecords.OrderByDescending(x =>
{
DateTime dt;
if (!DateTime.TryParse(x.DateOfCreation, out dt)) return DateTime.MaxValue;
return dt;
});
collectionRecords
来自
public class CollectionRecords
{
[Key]
...
...
public string AuthorSource { get; set; }
public string DateOfCreation { get; set; }
public string VolumeIssueNo { get; set; }
...
}
您可以实现
IComparable
接口,并重写方法CompareTo
,来决定默认的排序顺序。
您可能应该听听其他人对数据库结构的评论,但是为了解决
expression tree
错误,您可以首先在数据库上执行以下语句:
var orderedList3 = collectionRecords.ToList().OrderByDescending(x =>
{
DateTime dt;
if (!DateTime.TryParse(x.DateOfCreation, out dt)) return DateTime.MaxValue;
return dt;
});
展望未来根本不是一个好主意特别是如果你有更多数据。
首先,您不应该使用字符串作为日期,这就是为什么您最终必须在订购之前先将它们转换为 DateTime 的原因。如果您需要存储日期,请将其存储为日期,而不是字符串。
预期值看起来是错误的。如果我通过 LinqPad 运行您的代码,我会得到正确的输出
Apr 8 2018
march 2012
1991 May 8
various dates
undated
但这需要
DateTime.MinValue
而不是返回最大值。
我在 VS 中也得到相同的输出。
collectionRecords
的上下文是什么?可能是IQueryable
?我认为如果您在订购之前尝试将其转换为数组或IEnumerable
,它应该会像魅力一样工作。
已更新
如何将其存储在数据库中?作为字符串还是日期?创建到数据库的迁移并将其存储为日期,除非您特别要求将它们存储为字符串并存储“各种日期”或“未日期”等值,这有点错误,因为您打破了 DateTime 的概念。您不应在 DateTime 数据库字段中存储任何其他内容,也不应在 string/varchar 类型列中存储 DateTime 类型字段。数据库中最好有两个单独的列,例如:日期时间类型列,仅存储日期,并有一个布尔类型列,如“IsUdated”。
当然,如果您可以进行这些更改,这完全取决于您正在使用的软件,否则,您需要做您已经在做的事情,只需确保您用于表达的类型是正确的,而不是
IQueryable
,但一个列表或一个 IEnumerable
。