显然,PromotionalOffers 之间存在一对多关系
和PromotionalOffersUsed:每个PromotionalOffer 有零个或多个PromotionalOffersUsed,每个PromotionalOffersUsed 恰好属于一个PromotionalOffer。
如果您遵循entity framework conventions to design this one-to-many 关系,则不需要进行连接,也不需要左外连接,而是使用 ICollection 类:
class PromotionalOffer
{
public int Id {set; set;}
// a PromotionalOffer has zero or more PromotionalOfferUsed
public virtual ICollection<PromotionalOfferUsed> PromitionalOffersUsed {get; set;}
...
}
class PromotionalOfferUsed
{
public int Id {set; set;}
// every PromotionalOffersUsed belongs to exactly one PromotionalOffer
// using foreign key:
public int PromotionalOfferId {get; set;}
public PromotionalOffer PromotionalOffer {get; set;}
...
}
class MyDbContext: DbContext
{
public DbSet<PromotionalOffer> PromotionalOffers {get; set;}
public DbSet<PromotionalOfferUsed> PromotionalOffersUsed {get; set;
}
通常,这足以让实体框架知道您设计了一对多关系。
我们需要一些流畅的 API 的唯一原因是奇怪的复数:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// PromotionalOffersUsed are stored in a table with name PromotionOffersUsed:
modelBuilder.Entity<PromotionalOfferUsed>().ToTable("PromotionalOffersUdsed");
// Every PromotionalOffer has zero or more PromotionalOfferUsed
// every PromotionalOfferUsed belongs to exactly one (required) PromotionalOffer
// using foreign key PromtionalOfferId
modelBuilder.Entity<PromotionalOffer>
.HasMany(promotionalOffer => promotionalOffer.PromotionalOffersUsed)
.WithRequired(promotionalOfferUsed => promotionOfferUsed.PromotionalOffer)
.HasForeignKey(post => post.BlogId);
base.OnModelCreating(modelBuilder);
}
再一次,如果您有标准的单数和复数(Person/Persons;Account/Accounts,Order/Orders),则不需要这个流畅的 API。
现在您的查询:考虑集合,而不是联接。
给我所有 ISVCSPId 等于 10 的 PromotionalOffers
他们所有的 PromotionalOffersUsed 的 OfferId 等于 null
using (var dbContext = new MyDbContext())
{
var result = dbContext.PromotionalOffers
.Where(promotionalOffer => promotionalOffer.ISVCSPID == 10)
.Select(promotionalOffer => new
{ // select only the properties you will be using:
ISVCSPID = promotionalOffers.ISVSPID,
... // other properties from promotionalOffers
PromotionalOffersUsed = promotionalOffers.PromtionalOffersUsed
.Where(promotionalOffersUsed => promotionalOffersUsed.OfferId == null)
.Select(promotionalOffersUsed => new
{
// again: select only the properties of PromotionalOffersUsed
// that you will be using
Id = promotionalOffersUsed.Id,
... // other properties
})
.ToList();
}
}
因为实体框架知道有一个外键的一对多,它会为你做正确的左外连接。