Linq:按日期排序,将其存储为文本

时间:2011-11-19 23:59:51

标签: c# sql-server-2008 linq-to-entities

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

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

2 个答案:

答案 0 :(得分:2)

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

ALTER TABLE Foo
ADD trueDate AS
    CASE 
        WHEN type = 'date' THEN CONVERT(date, 'mixedColumn', 101)
        ELSE NULL
    END
PERSISTED

如果您有时间信息,date函数中的datetime应为CONVERT()

此外,101是指示预期格式MM/dd/yyyy的样式代码。如果你有不同的东西,请参考:http://msdn.microsoft.com/en-us/library/ms187928.aspx,但请记住,如果你使用低于100的样式,你的表达式将被认为是非确定性的,你不能使你的计算列PERSISTED,所以转换将在每次查询时动态完成(您不希望如此)。

当行值改变时,计算列将自动更新;否则值将保持可查询状态,就像在任何其他列中一样。无需触发器。

答案 1 :(得分:0)

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

选项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:数据库魔术
在数据库中添加一个额外的列,使该日期(可为空),如果鉴别器是日期,则更新该列。您可以在(DML)触发器中或从 C#中更新它... 或者,如果转换很简单,您可以构建一个视图 ...