我最近将.NET MongoDB驱动程序从传统驱动程序升级到较新的驱动程序。很多查询都不再起作用了,这一条把我难倒了。
var dataSource = permissions.Select(x => new PermissionSetPermissionGridViewModel
{
Id = x.Id,
PermissionGroupInfo = new KeyValuePair<Guid?, string>(x.PermissionGroupId, TitleHelper.GetPermissionGroupTitle(x.PermissionGroupId)),
IsEnabled = x.IsEnabled,
ObjectType = ObjectTypeIds.GetEnumValue(x.ObjectTypeId.Value)
}).ToList()它似乎不支持产生以下错误的静态函数TitleHelper.GetPermissionGroup()。
[NotSupportedException]: GetPermissionGroupTitle of type Saturn.WebUI.Core.Helpers.TitleHelper is not supported in the expression tree GetPermissionGroupTitle({document}{PermissionGroupId}).
at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateMethodCall(MethodCallExpression node)
at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateMapping(ProjectionMapping mapping)
at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateMapping(ProjectionMapping mapping)
at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateValue(Expression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateProjectValue(Expression selector)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateSelect(SelectExpression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Execute(Expression expression)
at MongoDB.Driver.Linq.MongoQueryableImpl`2.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Saturn.WebUI.Areas.Security.Controllers.PermissionSetRecordController.GetStaticPermissions(DataSourceRequest request, Guid permissionSetId) in C:\work\saturn-develop\saturn\src\Saturn.WebUI\Areas\Security\Controllers\PermissionSetRecordController.cs:line 87如何重构此查询以使其受较新的驱动程序支持?
发布于 2020-08-24 22:49:16
你的GetPermissionGroupTitle(...)方法不能被翻译成有意义的Mongo表达式(它没有等价物)。
您可以做的是在内存中获取所有需要的数据,然后调用该静态方法。基本上,您应该先调用.ToList(),然后再调用另一个用于调用静态方法的.Select(...)。另一种方法是使用AutoMapper -当在不同的模型之间映射时,我们调用这样的助手扩展方法。类似这样的东西应该是配置:
CreateMap<Permission, PermissionSetPermissionGridViewModel>()
.ForMember(
dest => dest.PermissionGroupInfo,
cfg => cfg.MapFrom(src => new KeyValuePair<Guid?, string>( TitleHelper.GetPermissionGroupTitle(src.PermissionGroupId, src.PermissionGroupId)))) https://stackoverflow.com/questions/63561905
复制相似问题