Linq 陷入;包括「;限制(除关键字段外,还需要通过自定义字段加入)
我有以下课程:Linq 陷入;包括「;限制(除关键字段外,还需要通过自定义字段加入),linq,entity-framework-core,left-join,Linq,Entity Framework Core,Left Join,我有以下课程: 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映射到表,并具有复合键。但该键中的一个字段是语言代码:在某些情况下,它是当前线程语言,
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
映射到表,并具有复合键。但该键中的一个字段是语言代码:在某些情况下,它是当前线程语言,在其他情况下,需要选择所有语言-例如,当admin要编辑本地化时(这是一个多年来由客户端创建的DB,结构不会改变)。这给我提出了数据选择的问题。我不能按原样使用Include
,因为语言代码需要有条件地连接。由于大量不同种类的B实体(代码不同-关键字段之一),我无法为每个B实体创建一个.NET类,从基类继承它并在基类中使用HasDiscriminator
,HasQueryFilter
之类的东西。事实上,我现在需要的是通过代码选择特定类型的B实体,使用类似的扩展方法(伪代码如下):
我需要“分组”
包括
-其中
,以便能够独立控制每个B-类实体的连接条件。我最终采用了以下方法
例如,具有子实体语言的类ModuleLanguage,不能通过键关系显式绑定:
public class ModuleLanguage
{
...
public string LanguageCode { get; set; }
public FixCodeValue Language { get; set; }
...
}
builder.Entity<ModuleLanguage>(b =>
{
b.Ignore(x => x.Language);
}
public class ModuleLanguage
{
...
public string LanguageCode { get; set; }
public FixCodeValue Language { get; set; }
...
}
builder.Entity<ModuleLanguage>(b =>
{
b.Ignore(x => x.Language);
}
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);
});