【发布时间】: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