gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:20:09 25 4
gpt4 key购买 nike

这似乎是一个不一致的地方,但我可能只是遗漏了一些明显的东西。基本查询是:

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 子句中将星期二替换为 2,则可以对此进行测试,它实际上会起作用。这将在枚举后起作用,因为结果将成功映射到可用的 .net 对象,其中 DateTime.DayOfWeek 转换为“星期二”将正常工作。

关于c# - 为什么此 Linq 查询会为 Count() 返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com