C# LINQ Select()/Any()行为不正常?

C# LINQ Select()/Any()行为不正常?,c#,linq,C#,Linq,我有以下代码 return lStoredRecords.Select(u => u.sCardId == sCardId && u.rtMode == eRecordType && u.dtTime >= DateTime.Now.AddMinutes

我有以下代码

return lStoredRecords.Select(u => 
                                 u.sCardId == sCardId && 
                                 u.rtMode == eRecordType &&
                                 u.dtTime >= DateTime.Now.AddMinutes(-15.0)).Any();
但出于某种原因,它总是会回到真实的状态

lStoredRecords包含一条记录,因此它的dtTime不满足上述条件-因此我希望上面的代码行返回False


有什么想法吗?

您当前的代码项目将记录到布尔列表中。因为这个列表确实有一些元素,可能是真的,也可能是假的——这无关紧要,任何元素都会返回真的

改用:

return lStoredRecords.Any(u => 
                          u.sCardId == sCardId && 
                          u.rtMode == eRecordType &&
                          u.dtTime >= DateTime.Now.AddMinutes(-15.0));

当前代码将lStoredRecords投影到布尔列表。因为这个列表确实有一些元素,可能是真的,也可能是假的——这无关紧要,任何元素都会返回真的

改用:

return lStoredRecords.Any(u => 
                          u.sCardId == sCardId && 
                          u.rtMode == eRecordType &&
                          u.dtTime >= DateTime.Now.AddMinutes(-15.0));

我想你是想这么做

return lStoredRecords.Any(u => 
                             u.sCardId == sCardId && 
                             u.rtMode == eRecordType &&
                             u.dtTime >= DateTime.Now.AddMinutes(-15.0));
阅读与此处相关的Select和Any do


您编写的Select表达式将lStoredRecords转换为IEnumerable,然后检查是否有任何元素。根据您选择的表达式,它将填充true或false。我想你希望Select做的是Where实际做的事情。但更好的选择是将表达式放在任意位置。这将防止不必要的操作。

我认为您正在尝试这样做

return lStoredRecords.Any(u => 
                             u.sCardId == sCardId && 
                             u.rtMode == eRecordType &&
                             u.dtTime >= DateTime.Now.AddMinutes(-15.0));
阅读与此处相关的Select和Any do


您编写的Select表达式将lStoredRecords转换为IEnumerable,然后检查是否有任何元素。根据您选择的表达式,它将填充true或false。我想你希望Select做的是Where实际做的事情。但更好的选择是将表达式放在任意位置。这将防止不必要的操作。

首先,不清楚为什么要使用Select。我希望您只使用Any本身,将谓词指定为参数

其次,如果lStoredRecords有任何记录,它将始终返回true-没有谓词,它只返回输入序列中是否有任何记录,Select只是将输入值投影到ouptut值-它根本不进行任何筛选。如果您希望进行筛选,则应该使用

第三,不清楚你一开始是否想要。根据你的问题:

lStoredRecords包含一条记录,因此它的dtTime不满足上述条件-因此我希望上面的代码行返回False

如果您希望它在任何记录未能满足某个条件时返回false,那么几乎可以肯定的是,您应该使用All来代替它—您希望检查所有输入值是否与您的条件匹配

所以基本上你想要:

return lStoredRecords.All(u => u.sCardId == sCardId && 
                               u.rtMode == eRecordType &&
                               u.dtTime >= DateTime.Now.AddMinutes(-15.0));

首先,不清楚为什么要使用Select。我希望您只使用Any本身,将谓词指定为参数

其次,如果lStoredRecords有任何记录,它将始终返回true-没有谓词,它只返回输入序列中是否有任何记录,Select只是将输入值投影到ouptut值-它根本不进行任何筛选。如果您希望进行筛选,则应该使用

第三,不清楚你一开始是否想要。根据你的问题:

lStoredRecords包含一条记录,因此它的dtTime不满足上述条件-因此我希望上面的代码行返回False

如果您希望它在任何记录未能满足某个条件时返回false,那么几乎可以肯定的是,您应该使用All来代替它—您希望检查所有输入值是否与您的条件匹配

所以基本上你想要:

return lStoredRecords.All(u => u.sCardId == sCardId && 
                               u.rtMode == eRecordType &&
                               u.dtTime >= DateTime.Now.AddMinutes(-15.0));

您正在选择一个布尔值。您正在选择一个布尔值。