首页 > 解决方案 > 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

我觉得这很奇怪,不知道如何解决它,因为当我对其进行硬编码时,它发现一切正常,但是当我使用变量或其他东西时,即使“输入”相同,它也不起作用。

谢谢你的帮助!

标签: c#linq

解决方案


首先一些建议。而不是 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 有价值吗?


推荐阅读