#postgresql #entity-framework #linq #asp.net-core #entity-framework-core
#postgresql #entity-framework #linq #asp.net-core #entity-framework-core
Вопрос:
Сообщество. Я пытаюсь запросить базу данных, используя пространственные данные и PostgreSQL. Я использую NetTopologySuite. Пока все хорошо. Теперь моя модель не использует класс NetTopologySuitePoint, который имеет метод distanceTo, который транслируется в базе данных. Итак, в ModelCreating я сопоставляю это свойство и добавляю преобразование в-из точки. Здесь все в порядке, я могу запросить базу данных с помощью команд SQL, но теперь мне нужно сделать это с помощью EntityFrameworkCore, используя LINQ.
Для преобразования я использую:
builder.Entity<Address>(x =>
{
x.ToTable("Addresses");
x.Property(b => b.Coordinates).HasConversion(
v => new Point(v.Latitude, v.Longitude),
v => new Protos.Coordinates { Latitude = (float)v.X, Longitude = (float)v.Y });
});
Когда я хочу запросить:
await mRepository.AsQueryable<Business>()
.Include(x => x.TradeBranchs).ThenInclude(x => x.Address)
.Where(x => x.Category == category)
.Where(x => x.TradeBranchs.Any(b => EF.Property<Point>(b.Address, nameof(Address.Coordinates)).Distance(customerPoint) <= (distance / 1.609)))
.PaginateAsync(currentPage, pageSize);
Здесь я использую EF.СвойствоГеометрия.Точка>(b.Адрес, nameof(Адрес.Координаты)) потому что, как я уже говорил ранее, я не мог использовать Distance с моим собственным классом координат.
но я не знаю, почему выдается следующее исключение:
System.NullReferenceException: Object reference not set to an instance of an object. at Npgsql.EntityFrameworkCore.PostgreSQL.Query.ExpressionTranslators.Internal.NpgsqlGeometryMethodTranslator.TranslateGeometryMethod(SqlExpression instance, MethodInfo method, IReadOnlyList`1 arguments
at Npgsql.EntityFrameworkCore.PostgreSQL.Query.ExpressionTranslators.Internal.NpgsqlGeometryMethodTranslator.Translate(SqlExpression instance, MethodInfo method, IReadOnlyList`1 arguments, IDiagnosticsLogger`1 logger
at Microsoft.EntityFrameworkCore.Query.RelationalMethodCallTranslatorProvider.<>c__DisplayClass4_0.<Translate>b__3(IMethodCallTranslator t
at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext(
at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Func`2 predicate, Booleanamp; found
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate
at Microsoft.EntityFrameworkCore.Query.RelationalMethodCallTranslatorProvider.Translate(IModel model, SqlExpression instance, MethodInfo method, IReadOnlyList`1 arguments, IDiagnosticsLogger`1 logger
at Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression
at Npgsql.EntityFrameworkCore.PostgreSQL.Query.Internal.NpgsqlSqlTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCall
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression
at Npgsql.EntityFrameworkCore.PostgreSQL.Query.Internal.NpgsqlSqlTranslatingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression
at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression
at Npgsql.EntityFrameworkCore.PostgreSQL.Query.Internal.NpgsqlSqlTranslatingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression
at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.TranslateInternal(Expression expression
at Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.Translate(Expression expression
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateExpression(Expression expression
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateLambdaExpression(ShapedQueryExpression shapedQueryExpression, LambdaExpression lambdaExpression
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateWhere(ShapedQueryExpression source, LambdaExpression predicate
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateAny(ShapedQueryExpression source, LambdaExpression predicate
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.TranslateSubquery(Expression expression
at Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression
at Npgsql.EntityFrameworkCore.PostgreSQL.Query.Internal.NpgsqlSqlTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCall
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.TranslateInternal(Expression expression
at Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.Translate(Expression expression
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateExpression(Expression expression
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateLambdaExpression(ShapedQueryExpression shapedQueryExpression, LambdaExpression lambdaExpression
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateWhere(ShapedQueryExpression source, LambdaExpression predicate
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node
at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query
at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_0`1.<ExecuteAsync>b__0(
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancellationToken
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetAsyncEnumerator(CancellationToken cancellationToken
at System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.GetAsyncEnumerator(
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken
at Reddi.Backend.Manager.UserManager.GetBusinessesAsync(Address customerAddress, Double distance, BusinessCategory category, Int32 pageSize, Int32 currentPage) in /workspace/src/reddi/Backend/master/Reddi.Backend.Master/Manager/UserManager.cs:line 814
Кажется, что где-то его значение равно нулю, но где?
Комментарии:
1. похоже, проблема с запросом . Включить (x => x.TradeBranchs). Затем включить (x => x.Address). Я думаю, что проблема в этой строке.
2. @AVTUNEY что вы думаете об этом? Проблема с внешними ключами?