c# - c# linq 的限制在哪里
问题描述
这是一个愚蠢的问题,但我没有找到任何答案。我有 asp.net core mvc 项目,我这样做:
var model = await _db.MyDbSet.ToListAsync();
int Os = 0;
string name = User.Identity.Name;
Os = model.Where(s => s.UserName.Contains(name)).First().Os;
我的问题是在我的数据库中我有 900 +- 行。当我尝试从最后一行读取时,它会引发错误。然后,当我将数据编辑为例如 899 的行时,它工作正常。例如,我有三行。当我尝试在前两行中查找时,它工作正常,但是当我尝试在第三行中查找时,它会抛出错误。然后当我将数据从第三行移动到第二行时,它工作正常。所以基本上我无法从任何最后一行获取数据。一些想法?我正在谈论的错误:
System.NullReferenceException: Object reference not set to an instance of an object.
at VPSAplikace_WEB.Controllers.HomeController.<>c__DisplayClass3_0.<Index>b__1(ZamestnanciModel s) in E:\Všechny programy C#\VPS\VPSAplikace WEB\VPSAplikace WEB\Views\Home\HomeController.cs:line 38
at System.Linq.Enumerable.WhereListIterator`1.MoveNext()
at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found)
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at VPSAplikace_WEB.Controllers.HomeController.Index(String SendTo) in E:\Všechny programy C#\VPS\VPSAplikace WEB\VPSAplikace WEB\Views\Home\HomeController.cs:line 38
我试过: 1. “第三行”上的硬编码信息,它发现没问题。:
Console.WriteLine(_db.MyDbSet.Where(s => s.UserName == "SomeDataOnThirdRow").First().Os); //Returns data on last row
我觉得这很奇怪,不知道如何解决它,因为当我对其进行硬编码时,它发现一切正常,但是当我使用变量或其他东西时,即使“输入”相同,它也不起作用。
谢谢你的帮助!
解决方案
首先一些建议。而不是 usingWhere()
后跟First()
useFirst(s => s.UserName.Contains(name))
或FirstOrDefault(s => s.UserName.Contains(name))
. First 和 FirstOrDefault 之间的不同之处在于,第一个在找不到元素时抛出异常,而第二个返回 null。
做得更好!首先构建您的查询,然后针对数据库执行它以避免在内存中加载和过滤数据await _db.SingleOrDefaultAsync(s => s.UserName.Contains(name))
[ https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.entityframeworkqueryableextensions.singleordefaultasync?view=efcore-3.1] .
回到 Pavel Anikhouski 和 Fabio 提到的问题System.NullReferenceException
与查询无关。如果Where()
没有匹配,则返回不为 NULL 的空 IEnumerable!First()
空集合将抛出InvalidOperationException
(参考:https ://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.first?view=netcore-3.1 )。
您确定 User.Identity.Name 有价值吗?
推荐阅读
- node.js - 保存json文件覆盖数据而不是添加
- node.js - Nodejs 限制语言版本切换
- javascript - 根据下图从“react-native-elements”自定义 { SearchBar }
- php - PHPStorm Symfony/Twig 忽略来自实体的 getter
- node.js - docker mongoose 遇到连接超时,但在将 net 设置为主机值时有效
- git - VS Code Remote-Containers:在容器中打开存储库
- oracle - Oracle 19c 数据库静默安装 {FATAL] [INS-35954] 错误
- java - 将单个 Join 实例传递给多个 Specification 实例?
- c++ - C++中指针的简单问题——内存地址的交换
- python - for循环中的多处理