C# Linq:存储为文本时按日期排序

C# Linq:存储为文本时按日期排序,c#,sql-server-2008,linq-to-entities,C#,Sql Server 2008,Linq To Entities,我需要按日期排序,但日期作为文本存储在数据库中。我正在使用Linq to实体来执行查询 按照数据库的设计方式,将列更改为日期列是不可行的,因为该列中有许多不同的数据类型。有一个名为type的描述符列,因此我将知道特定行的类型。如果包含日期的所有行都使用相同的日期格式,则可以按其字符串值排序。但由于最常见的(即英语)日期格式不是以年份开始的,这可能会产生问题 选项A:在内存中排序。 var records = db.YourTable.Where(o=>o.Discriminator =="

我需要按日期排序,但日期作为文本存储在数据库中。我正在使用Linq to实体来执行查询


按照数据库的设计方式,将列更改为日期列是不可行的,因为该列中有许多不同的数据类型。有一个名为
type
的描述符列,因此我将知道特定行的类型。

如果包含日期的所有行都使用相同的日期格式,则可以按其字符串值排序。但由于最常见的(即英语)日期格式不是以年份开始的,这可能会产生问题

选项A:在内存中排序。

var records = db.YourTable.Where(o=>o.Discriminator =="date").AsEnumerable()
    .Select(o=>new {Entity= o, Date=DateTime.Parse(o.YourColumn)})
    .OrderBy(o.Date).Select(o=>o.Entity);
如果您有很多行,或者如果必须这样做,请不要这样做,至少要有足够的能力缓存有序的结果

选项B:数据库魔术
在数据库中添加一个额外的列,使该日期为空,如果鉴别器为Date,则更新该日期。您可以在(DML)触发器中或从C#…

或者,如果转换很简单,您可以从中构建一个视图…

您可以向表中添加一个计算列,当您的鉴别器具有特定值时,该列将这些字符串转换为日期(这里我刚刚使用了
'date'

如果您有时间信息,则在
CONVERT()
函数中,
date
应该是
datetime

此外,
101
是一种样式代码,表示预期的
MM/dd/yyyy
格式。如果您有不同的内容,请参考以下内容:,但请记住,如果使用低于100的样式,则表达式将被视为不确定的,并且您无法使计算列
持久化,因此每个查询都会即时进行转换(您不希望这样)


行值更改时,计算列将自动更新;否则,这些值将像在任何其他列中一样持久化并可查询。不需要触发器。

您希望如何处理非日期值?删除它们?在我的查询中,我将只选择日期值,因为我将在不同的列中有一个类型,告诉我数据列的类型is@Luke101首先将数据库中的所有记录检索到列表,然后对该列表执行操作(如排序…)我有大约90000行,如果我这样做的话,这将使网站瘫痪?@Luke101看看这里哇..很好。还有一件事。我能在那列上加个索引吗。我将存储日期、整数、字符串和其他数据类型。我想用不同的数据类型为列编制索引。这可能吗?@Luke101具有不同数据类型的列可以编制索引,但只能作为varchar编制索引。需要说明的是,computed列是一个添加的列,它只包含鉴别器指示日期的日期,否则为null。您可以在计算列上创建索引,如下所述:
ALTER TABLE Foo
ADD trueDate AS
    CASE 
        WHEN type = 'date' THEN CONVERT(date, 'mixedColumn', 101)
        ELSE NULL
    END
PERSISTED