C# Linq count返回0,但foeach返回其他值

C# Linq count返回0,但foeach返回其他值,c#,arrays,entity-framework,linq,C#,Arrays,Entity Framework,Linq,我目前正在用实体框架和ASP.Net为C#中的游戏服务器编程一个Web界面 并得到以下问题 那么这个 string apikey = blablabla userManager.Users.Count(u=> u.ApiKeys.Contains(apiKey) || u.SupportApiKey == apiKey)) 应返回1,但返回0 还有这个 bool found = false; foreach (WebinterfaceUser u in userManager.Users

我目前正在用实体框架和ASP.Net为C#中的游戏服务器编程一个Web界面

并得到以下问题

那么这个

string apikey = blablabla
userManager.Users.Count(u=> u.ApiKeys.Contains(apiKey) || u.SupportApiKey == apiKey))
应返回1,但返回0

还有这个

bool found = false;
foreach (WebinterfaceUser u in userManager.Users)
    if (u.ApiKeys.Contains(apiKey) || u.SupportApiKey == apiKey)
        found = true;
返回true(本质上是1,因为我只有一个数据库条目)

那为什么呢

这对我来说没有意义,因为两个函数应该返回相同的结果,对吗


我对c也有点陌生,也许我遗漏了一些东西,我希望你能帮助我:)

如果内存不是问题的话。试试这个

var apiCounts = userManager.Users.ToList().Count(u=> u.ApiKeys.Contains(apiKey) || u.SupportApiKey == apiKey));

它将在内存上执行,而不是在db上执行,可能是db级别与服务器端的某些内容导致了错误。

解决方案如下所示

new WebinterfaceDbContext().Users.ToList().First(u => u.ApiKeys.Contains(apiKey));
经过一些调查和测试,我得到了这个错误:

'System.Collections.ObjectModel.Collection`1[System.Guid]' cannot be used for parameter of type 'System.L inq.IQueryable`1[System.Guid]'

因此,我只是简单地向用户添加了ToList(),它成功了:)

在第一个版本中,过滤和计数是由数据库完成的,在第二个版本中,它是用c#在客户端完成的。因此,我的第一个猜测类似于排序规则:db可能会比较不区分大小写的字符串,而c#则区分大小写。您的行是什么样子的?在第一个示例中,您设置的变量值是0?您不需要等号吗:int results=userManager…….可能是实现差异:Count使用的是
System.Collections.Generic.IEnumerable
,而foreach使用的是
System.Collections.IEnumerator.GetEnumerator()
。虽然它们可能应该由相同的代码支持,但它们不是相同的东西。问题是SupportPiKey的比较是有效的!这就像在使用时没有填写apikey列表一样linq@AlwaysLearning因为问题是关于EF的,所以我确信这里的
Count()
适用于
IQueryable
,而不是
IEnumerable
。因此,第一个
Count
查询被转换为类似SQL的
Count()…其中
并在db上执行。
foreach
迭代从数据库返回的所有用户,并在客户端执行字符串比较。这与我发布的第二个代码不一样吗?我是说。。。它使用了多少内存?我需要手动处理吗?我真的不知道那种东西^^@Justin99b内存问题?这取决于用户数量,如果是百万用户的话。在内存中执行它会受到影响,因为您正在加载没有筛选器的所有用户。我还相信您的代码,如果您有
sqlprofiler
,那么每次迭代都会调用所有db用户。试试看