LINQ - 首先在 EF 代码中外部连接到父级 class
LINQ - outer join to parent class in EF code first
我认为这里缺少一些基本的东西。
我有以下 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
table.
上生成一个列 Company_ID
作为外键
我想 return 所有调制解调器,如果有的话,加上他们的公司 ID。
在 SQL 中,我会执行以下操作:
select * from Modem m
left outer join Company c on
m.Company_ID = c.ID
我熟悉在 DB 优先而不是代码优先中使用 .DefaultIfEmpty() 在 LINQ 中进行左外连接。
我感到困惑的地方是我在 LINQ 中没有可用的 m.Company_ID 来执行连接,因为它是由 EF 自动生成的。
如何在 LINQ 中执行此连接?
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.Modems
和 Modem.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
加入。
我认为这里缺少一些基本的东西。
我有以下 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
table.
Company_ID
作为外键
我想 return 所有调制解调器,如果有的话,加上他们的公司 ID。 在 SQL 中,我会执行以下操作:
select * from Modem m
left outer join Company c on
m.Company_ID = c.ID
我熟悉在 DB 优先而不是代码优先中使用 .DefaultIfEmpty() 在 LINQ 中进行左外连接。
我感到困惑的地方是我在 LINQ 中没有可用的 m.Company_ID 来执行连接,因为它是由 EF 自动生成的。
如何在 LINQ 中执行此连接?
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.Modems
和 Modem.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
加入。