EF Core 2.2 - запускается с двух разных колонок - PullRequest
0 голосов
/ 03 июля 2019

У меня есть запрос, чтобы получить все записи, где два разных столбца начинаются с одного и того же символа:

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();

Это ошибка или просто невозможно?

EDIT: Вот исключение; ничего не говорит мне:

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.

1 Ответ

2 голосов
/ 04 июля 2019

В качестве исключения вы получаете NullReferenceException, поэтому одно из двух строковых полей является нулевым.Лучше проверять нулевые значения в строках, если вы не гарантируете, что они не будут нулевыми.Причина, по которой этого не происходит с SQLServer, заключается в том, что этот оператор преобразован в операторы SQL и выполняется на SQL Server, который не генерирует нулевые исключения, а скорее игнорирует нулевые значения.Попробуйте изменить запрос, чтобы проверить наличие нулевых значений:

query.Where(p => (p.InternalOrder != null && p.InternalOrder.StartsWith("G))
  || (p.CostCenter != null && p.CostCenter.StartsWith("G"))) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...