首页 > 解决方案 > 如果实体未通过导航连接,如何在数据库端排序(因为不可能)

问题描述

我想将我的 EfCore 查询翻译成以下 SQL 查询:

select
  c.blablabla
from
  codes c
  left join lookups l on c.codeId = l.entityid and l.languageCode = <variable - language code of current thread> and l.lookuptype = 'CODE'
where
  ..something..
order by
  l.displayname

注意:表“代码”和“查找”未连接!'lookups' 包含许多不同语言的不同查找数据!

我陷入了 EfCore 的限制(例如“NavigationExpandingExpressionVisitor”失败)。我不想进行内存过滤,这对我来说看起来很傻......我错过了一些明显的东西吗?

从长远来看,我想制定通用方法来帮助按显示名称(或其他查找名称)对不同类型的实体进行排序 - 不仅仅是代码。

标签: left-joincomposite-keyef-core-3.1

解决方案


好像我想通了。如果有更好的方法 - 请告诉我:

    protected override IQueryable<FixCode> SortByDisplayName(IQueryable<FixCode> queryable, string languageCode = null)
    {
        return queryable
            .GroupJoin(
                DbContext.FixCodeValues.Where(x =>
                    x.DomainId == CentralToolConsts.Domains.CENTRAL_TOOLS
                    && x.CodeName == CentralToolsFieldTypes.CODE_ORIGIN
                    && (x.LanguageCode == languageCode || x.LanguageCode == CentralToolsDbLanguageCodes.English)),
                //TODO: this will be a 'selector' parameter
                code => code.CodeOriginId,
                codeOrigin => codeOrigin.StringValue,
                (c, co) => new
                {
                    Code = c,
                    CodeOrigin = co
                }
            )
            .SelectMany(
                x => x.CodeOrigin.DefaultIfEmpty(),
                (x, codeOrigin) => new { Code = x.Code, CodeOrigin = codeOrigin }
            )
            .OrderBy(x => x.CodeOrigin.ShortName)
            .Select(x => x.Code);
    }

推荐阅读