如何重构在select语句中使用静态方法的MongoDB.NET LINQ查询



我最近将.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:worksaturn-developsaturnsrcSaturn.WebUIAreasSecurityControllersPermissionSetRecordController.cs:line 87

如何重构此查询,以便更新的驱动程序支持它?

您的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)))) 

最新更新