首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重构在select语句中使用静态方法的MongoDB .NET LINQ查询

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

Stack Overflow用户
提问于 2020-08-24 21:20:55
回答 1查看 98关注 0票数 1

我最近将.NET MongoDB驱动程序从传统驱动程序升级到较新的驱动程序。很多查询都不再起作用了,这一条把我难倒了。

代码语言:javascript
复制
       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()。

代码语言:javascript
复制
    [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

如何重构此查询以使其受较新的驱动程序支持?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-24 22:49:16

你的GetPermissionGroupTitle(...)方法不能被翻译成有意义的Mongo表达式(它没有等价物)。

您可以做的是在内存中获取所有需要的数据,然后调用该静态方法。基本上,您应该先调用.ToList(),然后再调用另一个用于调用静态方法的.Select(...)。另一种方法是使用AutoMapper -当在不同的模型之间映射时,我们调用这样的助手扩展方法。类似这样的东西应该是配置:

代码语言:javascript
复制
CreateMap<Permission, PermissionSetPermissionGridViewModel>()
    .ForMember(
        dest => dest.PermissionGroupInfo,
        cfg => cfg.MapFrom(src => new KeyValuePair<Guid?, string>( TitleHelper.GetPermissionGroupTitle(src.PermissionGroupId, src.PermissionGroupId)))) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63561905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档