[英]LINQ - outer join to parent class in EF code first
我相信这里缺少基本的东西。
我有以下EF代码优先实体:Company和Modem。 公司可以有一个调制解调器列表。
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中使用DBDefault而不是代码优先的.DefaultIfEmpty()进行左外部联接的过程。
引起我困惑的是,我在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
加入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.