Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 陷入;包括「;限制(除关键字段外,还需要通过自定义字段加入)_Linq_Entity Framework Core_Left Join - Fatal编程技术网

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);
        }
    
  • 请使用正确的类型和属性名称将工作代码显示为。伪代码太模糊。抱歉,EF(Core)只支持物理FK关系。这里描述的逻辑(或多态)关系从来都不受EF和现在的EF-Core支持。您可能会在他们的GitHub repo上发布功能请求,并等待有一天最终实现,如果有足够的投票支持,那么他们会看到这样做的价值。但到目前为止,您仍然只能使用手动连接(没有关系/导航属性和相关属性)。
    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);
         });