我有一个查询来获取所有记录,其中两个不同的列以相同的字符开头:
var query = _db.Projects.AsQueryable();
query = query.Where(p => p.InternalOrder.StartsWith("G") || p.CostCenter.StartsWith("G"));
var list = query.toList();
这总是以异常结束。当我更改查询以便仅查询一列时,一切正常:
var query = _db.Projects.AsQueryable();
query = query.Where(p => p.InternalOrder.StartsWith("G") || p.InternalOrder.StartsWith("G"));
var list = query.toList();
这是错误还是无法解决?
编辑: 这是例外;什么都没告诉我:
System.NullReferenceException: Object reference not set to an instance of an object.
at lambda_method(Closure , Project )
at System.Linq.Enumerable.WhereEnumerableIterator`1.ToArray()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.OrderedEnumerable`1.GetEnumerator()+MoveNext()
at System.Linq.Enumerable.SelectIPartitionIterator`2.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider._TrackEntities[TOut,TIn](IEnumerable`1 results, QueryContext queryContext, IList`1 entityTrackingInfos, IList`1 entityAccessors)+MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at BMP_App.Controllers.Api.ProjectController.GetProjectList(DataSourceRequest request) in D:\...\Controllers\Api\ProjectController.cs:line 72
EDIT2: 这仅在使用内存数据库时发生。使用Sql-Server没问题。
答案 0 :(得分:2)
作为一个异常,您得到的是NullReferenceException,因此两个字符串字段之一为null。最好检查字符串上的空值,除非您保证它们不为空。 SQLServer不会发生这种情况的原因是该语句被转换为SQL语句并在SQL Server中运行,该SQL Server不会引发null异常,而是忽略null值。尝试更改查询以检查空值:
query.Where(p => (p.InternalOrder != null && p.InternalOrder.StartsWith("G))
|| (p.CostCenter != null && p.CostCenter.StartsWith("G")))