left-join - 如果实体未通过导航连接,如何在数据库端排序(因为不可能)
问题描述
我想将我的 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”失败)。我不想进行内存过滤,这对我来说看起来很傻......我错过了一些明显的东西吗?
从长远来看,我想制定通用方法来帮助按显示名称(或其他查找名称)对不同类型的实体进行排序 - 不仅仅是代码。
解决方案
好像我想通了。如果有更好的方法 - 请告诉我:
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);
}
推荐阅读
- javascript - 您如何以编程方式在 DataTables 中打开多行
- objective-c - 在 UIImageView 内使图像更小
- php - 如何获取 WooCommerce 产品变化值
- javascript - JSON 解析问题:“q\r\nq”
- html - 第一项在中心,第二项最后在 flex
- python - 相同形状的矩阵相乘
- r - 从列中提取值
- java - 为什么我的 CountDownTimer 没有在 onBackPressed() 中停止?
- javascript - Jest 遇到了意外的令牌导入 { configure } from 'enzyme'
- c# - 将 DataTable 添加到现有 DataTable 单元格