Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq Date演出死亡_C#_Linq_Performance_Datetime - Fatal编程技术网

C# Linq Date演出死亡

C# Linq Date演出死亡,c#,linq,performance,datetime,C#,Linq,Performance,Datetime,我有一个数据库,它存储的日期被分解成整数。即,日、月和年分别存储在不同的列中 在现有SQL查询中,使用的方法是: DATEADD(dd,-1,DATEADD(mm,Z.LastMonth,DATEADD(yy,Z.LastYear-1900,0))作为最后日期 我无法将数据库改为存储日期 进一步查看dateadd()函数,它是从整数(0)转换而来的。 Linq到SQL没有类似的功能,即Convert.ToDateTime(0)。这将导致一个无效的例外 我曾尝试连接字符串以创建日期,但它是WAYY

我有一个数据库,它存储的日期被分解成整数。即,日、月和年分别存储在不同的列中

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

DATEADD(dd,-1,DATEADD(mm,Z.LastMonth,DATEADD(yy,Z.LastYear-1900,0))作为最后日期

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

进一步查看dateadd()函数,它是从整数(0)转换而来的。 Linq到SQL没有类似的功能,即Convert.ToDateTime(0)。这将导致一个无效的例外

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

我还能做什么?我也不特别想开始将SQL查询混合到项目中


谢谢。

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

您是否可以编写:

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

好的,我在Linqpad中测试了这一点,似乎LinqtoSQL确实决定生成一些奇怪的字符转换查询。我不完全相信这是性能问题的根源,但您可以强制进行如下预测:

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%的与数据库相关的性能问题都是由于不良或不存在索引或不可搜索的查询造成的。

您可以映射函数,使其在LINQ-to-SQL中可用:

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

在性能方面,我假定此日期是您的主要筛选条件(您希望索引的日期)

如果是这样的话:

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

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

有什么理由不首先将信息存储为日期吗?我不这么认为。但是我现在不能改变。嘿,这是个主意。。。我怎么没想到呢!Thanks这比串接字符串快得多。我认为它感觉比dateadd()函数慢。现在就可以了。再次感谢你,伙计。@Mike:别凭感觉,描述一下吧!我发现很难想象这样一个简单的投影会比SQL中的大量日期操作慢得多。我留下了一个正在处理的SQL查询,没有注释,这就是我在调试窗口中看到的。进一步研究,它呈现的是与连接字符串相同的SQL。所以,这没有什么区别。我还需要得到下个月的最后一天,所以我在做:new DateTime(z.LastYear,z.LastMonth,z.LastDay)。AddMonths(1)。AddDays(-1);它正在输出一些超级SQL,这也需要时间。DATEADD(ms,(CONVERT(BigInt,@p17*86400000))%86400000,DATEADD(day,(CONVERT(BigInt,@p17*86400000))/86400000,DATEADD(MONTH,@p18,CONVERT(DATETIME,CONVERT(NCHAR(2),[Z].[lastmount])+('/'+(CONVERT(NCHAR(2),@p19)+('/'+CONVERT(NCHAR(4),[Z].[lastmear])))),101)))我也会去找一个视图或一个SP+1.