Я боролся с проблемой в течение некоторого времени.В настоящее время я перемещаю старый проект из структуры сущностей в ядро структуры сущностей 2.2.4.
В этом проекте пользователь может определить множество критериев поиска на веб-странице, прежде чем он сделает запрос данных.на сервер.Я не буду вдаваться в подробности запроса, но он связывает 5 таблиц, где 2 таблицы содержат список динамических параметров имя + значение (по вертикали хранятся в таблице).Эти параметры связаны с их родительской таблицей (сущностью).Запрос возвращает список уникальных идентификаторов.Они представляют уникальный ключ к одной из родительских таблиц.
Для моей простоты и сложности перевода такого запроса в запрос LINQ, я решил сначала динамически построить запрос с критериями поиска в строке ac #.
В предыдущей версии EntityFramework я достиг этого с помощью:
List<string> arrFilteredGlobalId = _dbContext.Database.SqlQuery<string>("select GLOBALID from.....").ToList<string>();
Тогда я могу сделать:
var full = from bundle in _dbContext.BUNDLE
where arrFilteredGlobalId.Contains(bundle.GLOBALID)
select bundle;
int num = full.Count(); // <= works perfectly
В новой новой версииЯдро EntityFramework, context.Database.SqlQuery больше не существует.Для достижения той же логики мне пришлось сделать следующее:
- Объявить новый класс DBGlobalIdentifier с одним свойством
public class DBGlobalIdentifier
{
public string GLOBALID { get; set; }
}
В моем классе контекста я объявил объект DbQuery, набранный с помощью ранее определенного класса DBGlobalIdentifier.
public virtual DbQuery<DBGlobalIdentifier> Identifiers { get; set; }
Наконец, я делаю
IQueryable<DBGlobalIdentifier> arrFilteredGlobalId = this._context.Identifiers.FromSql("select GLOBALID from.....");
// DBGlobalIdentifier test = arrFilteredGlobalId.First(); <== works perfectly.
var full = from bundle in _context.Bundles
where arrFilteredGlobalId.Contains(new DBGlobalIdentifier() { GLOBALID = bundle.GLOBALID })
select bundle;
int num = full.Count(); // <= it fails and returns an exception (see here under)
Возникло исключение:
An unhandled exception occurred while processing the request.
NullReferenceException: Object reference not set to an instance of an object.
Microsoft.EntityFrameworkCore.Query.Internal.QueryOptimizer.TryOptimizeContains(ResultOperatorBase resultOperator, QueryModel queryModel)
NullReferenceException: Object reference not set to an instance of an object.
Microsoft.EntityFrameworkCore.Query.Internal.QueryOptimizer.TryOptimizeContains(ResultOperatorBase resultOperator, QueryModel queryModel)
Microsoft.EntityFrameworkCore.Query.Internal.QueryOptimizer.VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, int index)
Remotion.Linq.Clauses.ResultOperatorBase.Accept(IQueryModelVisitor visitor, QueryModel queryModel, int index)
Remotion.Linq.QueryModelVisitorBase.VisitResultOperators(ObservableCollection<ResultOperatorBase> resultOperators, QueryModel queryModel)
Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel)
Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.TransformingQueryModelExpressionVisitor<TVisitor>.VisitSubQuery(SubQueryExpression expression)
Remotion.Linq.Clauses.Expressions.SubQueryExpression.Accept(ExpressionVisitor visitor)
System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
Remotion.Linq.Clauses.WhereClause.TransformExpressions(Func<Expression, Expression> transformation)
Remotion.Linq.QueryModel.TransformExpressions(Func<Expression, Expression> transformation)
Microsoft.EntityFrameworkCore.Query.Internal.QueryOptimizer.Optimize(QueryCompilationContext queryCompilationContext, QueryModel queryModel)
Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.OptimizeQueryModel(QueryModel queryModel, bool asyncQuery)
Microsoft.EntityFrameworkCore.Query.RelationalQueryModelVisitor.OptimizeQueryModel(QueryModel queryModel, bool asyncQuery)
Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.CreateQueryExecutor<TResult>(QueryModel queryModel)
Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore<TResult>(Expression query, IQueryModelGenerator queryModelGenerator, IDatabase database, IDiagnosticsLogger<Query> logger, Type contextType)
Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler+<>c__DisplayClass13_0<TResult>.<Execute>b__0()
Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore<TFunc>(object cacheKey, Func<Func<QueryContext, TFunc>> compiler)
Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute<TResult>(Expression query)
System.Linq.Queryable.Count<TSource>(IQueryable<TSource> source)
Идея о моей проблеме?
Спасибо!Фред