LINQ-外部联接到EF代码中的父类

本文关键字:代码 父类 EF 外部 LINQ- | 更新日期: 2023-09-27 18:20:37

我认为这里缺少一些基本的东西。

我有以下EF代码优先实体:公司和调制解调器。一个公司可以有一个调制解调器列表。

 public class Company
    {
        public int ID { get; set; }
        ...
        public virtual ICollection<Modem> Modems { get; set:}
    }  

 public class Modem
    {
        public int ID { get; set; }
        ...
    }

这将在Modem表上生成列Company_ID作为外键。

如果有的话,我想退回所有调制解调器,并附上它们的公司ID。在SQL中,我将执行以下操作:

select * from Modem m
left outer join Company c on 
m.Company_ID = c.ID

我熟悉在LINQ中先在DB中使用.DefaultIfEmpty()而不是先在代码中使用左外部联接。

我感到困惑的是,我在LINQ中没有m.Company_ID来执行联接,因为它是由EF自动生成的。

如何在LINQ中执行此联接?

LINQ-外部联接到EF代码中的父类

EF的真正美妙之处在于,您根本不需要考虑联接(大多数情况下)。您所需要的只是通过导航属性正确定义实体及其关系。例如,这里有一个类似于您的模型的定义:

public class Company
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Modem> Modems { get; set; }
}
public class Modem
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual Company Company { get; set; }
}
public class MyDbContext : DbContext
{
    public DbSet<Company> Companies { get; set; }
    public DbSet<Modem> Modems { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>()
            .HasMany(company => company.Modems)
            .WithOptional(modem => modem.Company)
            .Map(action => action.MapKey("Company_ID"));
        base.OnModelCreating(modelBuilder);
    }
}

请注意Company.ModemsModem.Company属性,以及关系的流畅配置,包括FK列的名称。

现在,如果我们进行以下

using (var db = new MyDbContext())
{
    var query = db.Modems.Select(m => new { Modem = m, CompanyName = m.Company.Name });
    var sqlQuery = query.ToString();
}

sqlQuery变量包含

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Company_ID] AS [Company_ID], 
    [Extent2].[Name] AS [Name1]
    FROM  [dbo].[Modems] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Companies] AS [Extent2] ON [Extent1].[Company_ID] = [Extent2].[ID]

就这样——希望你能看到你所要求的LEFT OUTER加入。