ExplicitExpansion() 导致 OData 扩展不起作用
ExplicitExpansion() cause OData expand not work
当使用 ExplicitExpansion() 时,Odata 展开不起作用。
我的 DTo 和 EF 模型可以在下面找到 link。
Querying DTOs based on EF using Odata
我的自动映射器class:
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
CreateMap<ClientRef, ClientContract>().
ForMember(dest => dest.ValidFrom,
opt =>
{
opt.MapFrom(y => y.Clients.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).ValidFrom);
}).
ForMember(dest => dest.ValidTo,
opt =>
{
opt.MapFrom(y => y.Clients.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).ValidTo);
}).
ForMember(dest => dest.FirstName,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).FirstName);
}).
ForMember(dest => dest.LastName,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).LastName);
}).
ForMember(dest => dest.BirthDate,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).BirthDate);
}).
ForMember(dest => dest.FatherName,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).FatherName);
}).
ForMember(dest => dest.CompanyName,
opt =>
{
opt.MapFrom(y => y.Companies.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).CompanyName);
})
.
ForMember(dest => dest.PinNumber,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).Pin);
}).
ForMember(dest => dest.Position,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).Position);
}).
ForMember(dest => dest.PositionCustom,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).PositionCustom);
}).
ForMember(dest => dest.ClientType,
opt =>
{
opt.MapFrom(y => y.Clients.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).ClientType);
})
.
ForMember(dest => dest.Documents,
opt =>
{
opt.MapFrom(y => y.Documents.Where(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now));
//opt.ExplicitExpansion();
})
.ForMember(dest => dest.ContactsInfo,
opt =>
{
opt.MapFrom(y => y.ClientContactInfoComps.Where(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).Select(x => x.ContactInfo));
//opt.ExplicitExpansion();
}).
ForMember(dest => dest.ClientComment,
opt =>
{
opt.MapFrom(y => y.CommentComps.Where(x => x.Contact == null).Select(x => x.Comment));
//opt.ExplicitExpansion();
}).
ForMember(dest => dest.Relations,
opt =>
{
opt.MapFrom(y => y.ClientRelationCompClient1Navigations);
//opt.ExplicitExpansion();
})
;
CreateMap<Document, DocumentContract>();
CreateMap<ContactInfo, ContactInfoContract>().
ForMember(dest => dest.ContactComments,
opt =>
{
opt.MapFrom(y => y.CommentComps.Select(x => x.Comment));
});
CreateMap<ClientRelationComp, RelationContract>().
ForMember(dest => dest.ClientINN,
opt => {
opt.MapFrom(x => x.Client2);
}).
ForMember(dest => dest.RelationType,
opt => {
opt.MapFrom(x => x.RelationId);
});
CreateMap<ICollection<Client>, ClientContract>();
CreateMap<ICollection<PhysicalPerson>, ClientContract>();
CreateMap<ICollection<Company>, ClientContract>();
CreateMap<Comment, CommentContract>();
CreateMap<ICollection<Comment>, ICollection<ContactInfoContract>>();
CreateMap<ICollection<ClientRelationComp>, ClientRef>();
}
}
我的控制器:
public class ClientContractController : ODataController
{
CRMContext _context;
IMapper _mapper;
public ClientContractController(CRMContext ctx, IMapper mapper )
{
_context = ctx;
_mapper = mapper;
}
[EnableQuery(MaxExpansionDepth = 10)]
public IQueryable<ClientContract> Get()
{
return _mapper.ProjectTo<ClientContract>(_context.ClientRefs).Where(x => x.ValidFrom <= DateTime.Now && x.ValidTo >= DateTime.Now);
}
}
这给出了以下异常
https://localhost:44371/odata/clientcontract?$expand=relations
System.InvalidOperationException: 无法翻译 LINQ 表达式“$it”。以可以翻译的形式重写查询,或者通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端评估。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038。
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberAssignment(MemberAssignment 成员分配)
在 System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding 节点)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberInit(MemberInitExpression memberInitExpression)
在 System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](表达式1 node) at System.Linq.Expressions.Expression
1.Accept(ExpressionVisitor 访问者)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 System.Dynamic.Utils.ExpressionVisitorUtils.VisitArguments(ExpressionVisitor 访问者,IArgumentProvider 节点)
在 System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression 节点)
在 System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberAssignment(MemberAssignment 成员分配)
在 System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding 节点)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberInit(MemberInitExpression memberInitExpression)
在 System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberAssignment(MemberAssignment 成员分配)
在 System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding 节点)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberInit(MemberInitExpression memberInitExpression)
在 System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Translate(SelectExpression selectExpression, Expression 表达式)
在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateSelect(ShapedQueryExpression 来源,LambdaExpression 选择器)
在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
在 System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](表达式查询)
在 Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](表达式查询,布尔异步)
在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase 数据库、表达式查询、IModel 模型、布尔异步)
在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_01.<ExecuteAsync>b__0() at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func
1 个编译器)
在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](表达式查询,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](表达式表达式,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable1.GetAsyncEnumerator(CancellationToken cancellationToken) at Microsoft.AspNetCore.Mvc.Infrastructure.AsyncEnumerableReader.ReadInternal[T](Object value) at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsyncEnumerable(ActionContext context, ObjectResult result, Object asyncEnumerable, Func
2 reader)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|21_0(ResourceInvoker 调用程序,IActionResult 结果)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker 调用程序、任务 lastTask、接下来的状态、范围范围、对象状态、布尔值已完成)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed 上下文)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker 调用程序、Task lastTask、State next、Scope 范围、对象状态、Boolean isCompleted)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker 调用程序)
在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(端点端点、任务请求任务、ILogger 记录器)
在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文)
在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)
更新 21/08/20202
如果没有 explicit instructions,AutoMapper
将展开结果中的所有成员。
要控制在投影时扩展哪些成员,在配置中设置ExplicitExpansion
,然后传入要显式扩展的成员:
dbContext.Orders.ProjectTo<OrderDto>(configuration,
dest => dest.Customer,
dest => dest.LineItems);
// or string-based
dbContext.Orders.ProjectTo<OrderDto>(configuration,
null,
"Customer",
"LineItems");
// for collections
dbContext.Orders.ProjectTo<OrderDto>(configuration,
null,
dest => dest.LineItems.Select(item => item.Product));
在使用 OData
时使用 属性 名称而不是属性名称。
OData
客户端库依赖于它自己的属性 OriginalNameAttribute
在服务器发出名称时获取有关 class/member 名称的知识。详情请见here.
当使用 ExplicitExpansion() 时,Odata 展开不起作用。 我的 DTo 和 EF 模型可以在下面找到 link。 Querying DTOs based on EF using Odata
我的自动映射器class:
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
CreateMap<ClientRef, ClientContract>().
ForMember(dest => dest.ValidFrom,
opt =>
{
opt.MapFrom(y => y.Clients.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).ValidFrom);
}).
ForMember(dest => dest.ValidTo,
opt =>
{
opt.MapFrom(y => y.Clients.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).ValidTo);
}).
ForMember(dest => dest.FirstName,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).FirstName);
}).
ForMember(dest => dest.LastName,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).LastName);
}).
ForMember(dest => dest.BirthDate,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).BirthDate);
}).
ForMember(dest => dest.FatherName,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).FatherName);
}).
ForMember(dest => dest.CompanyName,
opt =>
{
opt.MapFrom(y => y.Companies.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).CompanyName);
})
.
ForMember(dest => dest.PinNumber,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).Pin);
}).
ForMember(dest => dest.Position,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).Position);
}).
ForMember(dest => dest.PositionCustom,
opt =>
{
opt.MapFrom(y => y.PhysicalPeople.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).PositionCustom);
}).
ForMember(dest => dest.ClientType,
opt =>
{
opt.MapFrom(y => y.Clients.FirstOrDefault(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).ClientType);
})
.
ForMember(dest => dest.Documents,
opt =>
{
opt.MapFrom(y => y.Documents.Where(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now));
//opt.ExplicitExpansion();
})
.ForMember(dest => dest.ContactsInfo,
opt =>
{
opt.MapFrom(y => y.ClientContactInfoComps.Where(x => x.ValidFrom <= DateTime.Now && x.ValidTo > DateTime.Now).Select(x => x.ContactInfo));
//opt.ExplicitExpansion();
}).
ForMember(dest => dest.ClientComment,
opt =>
{
opt.MapFrom(y => y.CommentComps.Where(x => x.Contact == null).Select(x => x.Comment));
//opt.ExplicitExpansion();
}).
ForMember(dest => dest.Relations,
opt =>
{
opt.MapFrom(y => y.ClientRelationCompClient1Navigations);
//opt.ExplicitExpansion();
})
;
CreateMap<Document, DocumentContract>();
CreateMap<ContactInfo, ContactInfoContract>().
ForMember(dest => dest.ContactComments,
opt =>
{
opt.MapFrom(y => y.CommentComps.Select(x => x.Comment));
});
CreateMap<ClientRelationComp, RelationContract>().
ForMember(dest => dest.ClientINN,
opt => {
opt.MapFrom(x => x.Client2);
}).
ForMember(dest => dest.RelationType,
opt => {
opt.MapFrom(x => x.RelationId);
});
CreateMap<ICollection<Client>, ClientContract>();
CreateMap<ICollection<PhysicalPerson>, ClientContract>();
CreateMap<ICollection<Company>, ClientContract>();
CreateMap<Comment, CommentContract>();
CreateMap<ICollection<Comment>, ICollection<ContactInfoContract>>();
CreateMap<ICollection<ClientRelationComp>, ClientRef>();
}
}
我的控制器:
public class ClientContractController : ODataController
{
CRMContext _context;
IMapper _mapper;
public ClientContractController(CRMContext ctx, IMapper mapper )
{
_context = ctx;
_mapper = mapper;
}
[EnableQuery(MaxExpansionDepth = 10)]
public IQueryable<ClientContract> Get()
{
return _mapper.ProjectTo<ClientContract>(_context.ClientRefs).Where(x => x.ValidFrom <= DateTime.Now && x.ValidTo >= DateTime.Now);
}
}
这给出了以下异常 https://localhost:44371/odata/clientcontract?$expand=relations
System.InvalidOperationException: 无法翻译 LINQ 表达式“$it”。以可以翻译的形式重写查询,或者通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端评估。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038。
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberAssignment(MemberAssignment 成员分配)
在 System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding 节点)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberInit(MemberInitExpression memberInitExpression)
在 System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](表达式1 node) at System.Linq.Expressions.Expression
1.Accept(ExpressionVisitor 访问者)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 System.Dynamic.Utils.ExpressionVisitorUtils.VisitArguments(ExpressionVisitor 访问者,IArgumentProvider 节点)
在 System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression 节点)
在 System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberAssignment(MemberAssignment 成员分配)
在 System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding 节点)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberInit(MemberInitExpression memberInitExpression)
在 System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberAssignment(MemberAssignment 成员分配)
在 System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding 节点)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberInit(MemberInitExpression memberInitExpression)
在 System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
在Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(表达式表达式)
在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Translate(SelectExpression selectExpression, Expression 表达式)
在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateSelect(ShapedQueryExpression 来源,LambdaExpression 选择器)
在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
在 System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor 访客)
在 System.Linq.Expressions.ExpressionVisitor.Visit(表达式节点)
at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](表达式查询)
在 Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](表达式查询,布尔异步)
在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase 数据库、表达式查询、IModel 模型、布尔异步)
在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_01.<ExecuteAsync>b__0() at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func
1 个编译器)
在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](表达式查询,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](表达式表达式,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable1.GetAsyncEnumerator(CancellationToken cancellationToken) at Microsoft.AspNetCore.Mvc.Infrastructure.AsyncEnumerableReader.ReadInternal[T](Object value) at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsyncEnumerable(ActionContext context, ObjectResult result, Object asyncEnumerable, Func
2 reader)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|21_0(ResourceInvoker 调用程序,IActionResult 结果)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker 调用程序、任务 lastTask、接下来的状态、范围范围、对象状态、布尔值已完成)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed 上下文)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker 调用程序、Task lastTask、State next、Scope 范围、对象状态、Boolean isCompleted)
在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker 调用程序)
在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(端点端点、任务请求任务、ILogger 记录器)
在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文)
在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)
更新 21/08/20202
如果没有 explicit instructions,AutoMapper
将展开结果中的所有成员。
要控制在投影时扩展哪些成员,在配置中设置ExplicitExpansion
,然后传入要显式扩展的成员:
dbContext.Orders.ProjectTo<OrderDto>(configuration,
dest => dest.Customer,
dest => dest.LineItems);
// or string-based
dbContext.Orders.ProjectTo<OrderDto>(configuration,
null,
"Customer",
"LineItems");
// for collections
dbContext.Orders.ProjectTo<OrderDto>(configuration,
null,
dest => dest.LineItems.Select(item => item.Product));
在使用 OData
时使用 属性 名称而不是属性名称。
OData
客户端库依赖于它自己的属性 OriginalNameAttribute
在服务器发出名称时获取有关 class/member 名称的知识。详情请见here.