【问题标题】:Linq count returns 0 but foeach returns something elseLinq 计数返回 0 但 foreach 返回其他值
【发布时间】:2019-08-21 09:18:23
【问题描述】:

我目前正在使用 C# 使用 Entity Framework 和 ASP-Net 为游戏服务器编写 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;

返回真(所以本质上是 1,因为我只有一个数据库条目)

那是为什么呢?

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

我对 c# 也有点陌生,也许我错过了一些我希望你能帮助我的东西:)

【问题讨论】:

  • 在第一个版本中,过滤和计数由数据库完成,在第二个版本中,它在 c# 中完成客户端。所以我的第一个猜测是排序规则之类的:数据库可能比较字符串不区分大小写,而 c# 工作区分大小写。你的行是什么样子的?
  • 你在第一个例子中设置了什么变量,你得到的值为 0?你不需要等号:int results = userManager........
  • 可能是实现上的差异:Count 使用 System.Collections.Generic.IEnumerable<User>,而 foreach 使用 System.Collections.IEnumerator.GetEnumerator()。尽管它们可能应该由相同的代码支持,但它们并不是一回事。
  • 问题是SupportApiKey的比较有效!就像使用 linq 时没有填充 apikey 列表一样
  • @AlwaysLearning 因为问题是关于 EF 的,我敢肯定 Count() 这里适用于 IQueryable<User>,而不是 IEnumerable<User>。所以第一个Count 查询被翻译成类似COUNT()...WHERE 的SQL 并在数据库上执行。 foreach 遍历从数据库返回的所有用户,并在客户端进行字符串比较。

标签: c# arrays entity-framework linq


【解决方案1】:

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

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

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

【讨论】:

  • 不是和我发布的第二个代码一样吗?我的意思是...它使用了多少内存?我需要手动处理吗?我真的不知道那种东西^^
  • @Justin99b 内存问题?它取决于用户的数量,如果它是百万用户。在内存上执行它会受到影响,因为您正在加载所有没有过滤器的用户。我也相信你的代码,如果你有sql profiler,每次迭代都会调用所有数据库用户。试试看
【解决方案2】:

解决方法如下

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() 添加到 Users 并且它起作用了 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    相关资源
    最近更新 更多