如何解决陷入“包含”限制除关键字段之外,还需要通过自定义字段加入
我有以下课程:
public class A {
public B B_a_1 { get; set; }
...
public B B_a_[N] { get; set; }
}
public class C {
public B B_c_1 { get; set; }
...
public B B_c_[M] { get; set; }
}
B 类通过OnModelCreating
映射到表,并且具有复合键。但是此键中的一个字段是语言代码:在某些情况下,它是线程语言,在其他情况下,则需要选择所有语言-例如,当管理员将要编辑本地化(这是一个由客户创建的数据库多年,其结构也不会更改)。这给我带来了数据选择的问题。我不能按原样使用Include
,因为语言代码需要有条件地加入。由于大量的不同种类的 B 实体(根据 code -关键字段之一而不同),我无法为每个 B 实体,从基类继承它,并在基类中使用HasDiscriminator
,HasQueryFilter
和类似的东西。实际上,我现在需要的是使用诸如此类的 Extension 方法通过 code 选择特定类型的 B 实体(伪代码是以下):
DbSet<A>.Include(x => x.B_a_1).Where(x => x.B_a_1.LanguageCode = "E").Include(x => x.B_a_[N]).Where(x => x.B_a_[N].SomeProperty = "Something")
将被翻译为:
FROM Table_A a
LEFT JOIN Table_B b1 ON b1.Code = a.Code AND b1.LanguageCode = 'E'
LEFT JOIN Table_B b2 ON b2.Code = a.Code AND b2.SomeProperty = 'Something'
我需要对include
-where
进行“分组”,以便能够独立控制每个 B 实体的 JOIN 条件。
解决方法
我最终采用了以下方法。
例如具有带有子实体 Language 的类 ModuleLanguage ,该子实体不能通过键关系进行显式绑定:
public class ModuleLanguage
{
...
public string LanguageCode { get; set; }
public FixCodeValue Language { get; set; }
...
}
-
我在模型创建中忽略了此类属性:
builder.Entity<ModuleLanguage>(b => { b.Ignore(x => x.Language); }
-
手动加载此属性( FixCodeValue 类实际上由许多子实体使用,并且它们都需要从同一数据库表中选择,但要基于不同的条件):>
var currentLanguageCode = DbContext.CurrentLanguage; await query.ForEachAsync(moduleLanguage => { moduleLanguage.Language = DbContext.FixCodeValues .FirstOrDefault(language => language.DomainId == CentralToolsDomainTypes.CentralTools && language.CodeName == CentralToolsFieldTypes.LANGUAGE && language.StringValue == moduleLanguage.LanguageCode && language.LanguageCode == currentLanguageCode); });
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。