Linq日期表演死亡

时间:2010-02-25 04:30:27

标签: c# linq performance datetime

我有一个数据库,可以存储分为int的日期。即日,月和年分别存储在不同的列中。

在现有的SQL查询中,使用的方法是:

DATEADD(dd, - 1,DATEADD(mm,Z.LastMonth,DATEADD(yy,Z.LastYear - 1900,0)))AS last_date

我无法将数据库更改为存储日期。

进一步研究dateadd()函数,它是从整数(0)转换而来的。 Linq to SQL没有类似的功能,即Convert.ToDateTime(0)。这会导致InvalidCastException。

我已尝试连接字符串以创建日期,但它是WAYYYYY tooooo sllloowww。时差约为10分钟。

我还能做什么?我并不特别想在项目中将SQL查询混合起来。

感谢。

6 个答案:

答案 0 :(得分:3)

您可以将linq to sql map映射到自定义sql语句或存储过程以获得相同的sql性能。

答案 1 :(得分:3)

你能不能写:

table.Select(z => new DateTime(z.LastYear, z.LastMonth, z.LastDay));

好吧,我在Linqpad中对此进行了测试,看起来Linq to SQL确实决定生成一些奇怪的字符转换查询。我并不完全相信这是性能问题的根源,但您可以强制进行这样的预测:

var dates = 
    (from z in table
     select new { Year = z.LastYear, Month = z.LastMonth, Day = z.LastDay })
    .AsEnumerable()
    .Select(d => new 
        {
            Date = new DateTime(d.Year, d.Month, d.Day),
            NextDate = new DateTime(d.Year, d.Month, 1).AddMonths(2).AddDays(-1)
        });

这也可以让你在下个月的最后一天。

如果你真的看到了如此巨大的表现,差异,我会冒险猜测你正在寻找错误的地方,并且还有其他不同之处。所有与数据库相关的性能问题中有90%是由于索引不佳或不存在索引或不可搜索的查询造成的。

答案 2 :(得分:1)

您可以映射函数以使其在LINQ-TO-SQL中可用:http://msdn.microsoft.com/en-us/library/bb546175.aspx

答案 3 :(得分:1)

您可以向数据库添加视图吗?如果可以的话,你可以定义一个看起来就像你的表的视图,除了有一个真实的日期,因为它是你的转折那些疯狂的列到最新的查询。然后用LINQ查询。我不记得SQL Server是否具有智能视图缓存,但如果是这样,它实际上可能比直接SQL执行得更好。

答案 4 :(得分:0)

在性能方面,我认为这个日期是您的主要过滤条件(您期望被索引的标准)。

如果是这种情况:

  • 确保索引中的列顺序为年,月,日。
  • 不要将Date条件作为DateTimes发送到数据库中,而是发送整数。如果在过滤之前将表列转换为日期,则索引无效。

答案 5 :(得分:0)

注意:比串联字符串快得多的是创建一个字符数组并自己设置字符数组的元素。如果您可以在编译时控制字符串的大小,这是最实用的。

相关问题