c# - 为什么此 Linq 查询对 Count() 返回 0?

标签 c# linq linq-to-sql

这似乎是不一致的,但我可能只是错过了一些明显的东西。基本查询是:

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/

相关文章:

c# - 如何导出从 Grasshopper 烘焙的顶点颜色,Rhino3d 在 Unity、Unreal 等游戏引擎中或直接在 webXr 中实时分析?

c# - 当查询包含连接时,如何在 crm sdk 2011 linq 查询中使用谓词?

c# - 使用 Entity Framework LINQ 有效检查数据库中是否存在记录

c# - VS2010 中 linq-to-sql dbml 文件中的奇怪映射错误

LINQ To SQL 实体对象作为域对象

c# - 安全清除列表(并发)

c# - 使用 subselect 和 groupby 的 LINQ 仅获取列表中每个项目的最新版本

c# - 如何在 WPF 中将组合框绑定(bind)到其他项目的枚举?

c# - 一次查询多个列表

c# - 索引 SQL 表会提高 LINQ 语句的性能吗?