这似乎是不一致的,但我可能只是错过了一些明显的东西。基本查询是:
var events = db.tbl_special_events.Where(x => x.TimeStamp >= startDate);
当我运行以下代码块时,出现明显的不一致:
int c1 = 0;
foreach (var e in events)
{
if (e.TimeStamp.DayOfWeek.ToString() == "Tuesday") c1++;
}
int c2 = events.Where(e => e.TimeStamp.DayOfWeek.ToString() == "Tuesday").Count();
运行之后,c1 是 1832,但 c2 是 0。我错过了什么?
最佳答案
我重新创建了这个测试,发现它可能与 DateTime 函数直接相关。
生成的查询:
exec sp_executesql N'SELECT [t0].[User_ID], [t0].[Email], [t0].[Password], [t0].[BrandID], [t0].[CustomerID], [t0].[Created], [t0].[EndDate], [t0].[AccountStatusID], [t0].[Verified], [t0].[ResetPasswordFailCount], [t0].[ResetPasswordLocked]
FROM [dbo].[User] AS [t0]
WHERE ((CONVERT(NVarChar,CONVERT(Int,(DATEPART(dw, [t0].[Created]) + (@@DATEFIRST) + 6) % 7))) = @p0) AND ([t0].[BrandID] = @p1)',N'@p0 nvarchar(4000),@p1 int',@p0=N'Tuesday',@p1=3
注意 @p0=N'Tuesday'
请记住,IQueryable 和 IEnumerable 的不同之处在于 IEnumerable 表示实际的 .net 对象,而 IQueryable 将表达式转换为用于查询数据库的实际 SQL 语句。因此,您在该表达式中提供的任何值实际上都会发送到数据库。
由于没有匹配项,因此返回 0 个结果。原因是,SQL 中的日期转换返回 2 而不是“星期二”。如果您在 LINQ WHERE 子句中将 Tuesday 替换为 2,您可以对此进行测试,它实际上会起作用。这将在枚举后起作用,因为结果将已成功映射到可用的 .net 对象,其中 DateTime.DayOfWeek 到“Tuesday”的转换将正常工作。
关于c# - 为什么此 Linq 查询对 Count() 返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115168/