C# linq:具有不同类型条件的linq中的左连接

C# linq:具有不同类型条件的linq中的左连接,c#,mysql,sql-server,entity-framework,C#,Mysql,Sql Server,Entity Framework,我有两张表,如promotionalOffers和promotionalOffers Used 我正在使用联接获取匹配记录,现在我想包括不同的条件,如PromotionalOffers.ISVCSPId=10和PromotionalOffersUsed.OfferId为null 我已经使用左连接在sql中编写了查询,但无法在linq中编写相同的查询 这里是我的sql查询 SELECT * FROM PromotionalOffers left JOIN PromotionalOffersUse

我有两张表,如promotionalOffers和promotionalOffers Used
我正在使用联接获取匹配记录,现在我想包括不同的条件,如PromotionalOffers.ISVCSPId=10和PromotionalOffersUsed.OfferId为null

我已经使用左连接在sql中编写了查询,但无法在linq中编写相同的查询

这里是我的sql查询

SELECT * 
FROM PromotionalOffers
left JOIN PromotionalOffersUsed ON PromotionalOffers.Id = PromotionalOffersUsed.OfferId where PromotionalOffers.ISVCSPId =10 and PromotionalOffersUsed.OfferId is null
我的linq查询是

(from s in db.PromotionalOffers
 join e in db.PromotionalOffersUsed on s.Id equals e.OfferId
 where s.ISVCSPId == iSVCSPData.Id
 select s).ToListAsync();

我不能在这里包含左连接

对于左连接,您必须这样做,下面是linq中左外连接的示例

var leftFinal =
        from l in lefts
        join r in rights on l equals r.Left into lrs
        from lr in lrs.DefaultIfEmpty()
        select new { LeftId = l.Id, RightId = ((l.Key==r.Key) ? r.Id : 0 };
质疑

SELECT * 
FROM PromotionalOffers
left JOIN PromotionalOffersUsed ON PromotionalOffers.Id = PromotionalOffersUsed.OfferId where PromotionalOffers.ISVCSPId =10 and PromotionalOffersUsed.OfferId is null
linq中的试探性查询

var leftFinal =
        (from l in PromotionalOffers.Where(p=> p.ISVCSPId ==10) 
        join r in PromotionalOffersUsed on l.ID equals r.OfferId  into lrs
        from lr in lrs.DefaultIfEmpty()
        select 
          new { LeftId = l.Id, RightId = ((l.ID==r.OfferId  ) ? r.OfferId   : -1 }
        ).where(d=> d.RightID != -1);

对于左连接,您必须这样做,下面是linq中左外连接的示例

var leftFinal =
        from l in lefts
        join r in rights on l equals r.Left into lrs
        from lr in lrs.DefaultIfEmpty()
        select new { LeftId = l.Id, RightId = ((l.Key==r.Key) ? r.Id : 0 };
质疑

SELECT * 
FROM PromotionalOffers
left JOIN PromotionalOffersUsed ON PromotionalOffers.Id = PromotionalOffersUsed.OfferId where PromotionalOffers.ISVCSPId =10 and PromotionalOffersUsed.OfferId is null
linq中的试探性查询

var leftFinal =
        (from l in PromotionalOffers.Where(p=> p.ISVCSPId ==10) 
        join r in PromotionalOffersUsed on l.ID equals r.OfferId  into lrs
        from lr in lrs.DefaultIfEmpty()
        select 
          new { LeftId = l.Id, RightId = ((l.ID==r.OfferId  ) ? r.OfferId   : -1 }
        ).where(d=> d.RightID != -1);
像这样尝试

(from s in db.PromotionalOffers
 join e in db.PromotionalOffersUsed on s.Id equals e.OfferId into joinT
 from e in joinT.DefaultIfEmpty()
 where s.ISVCSPId == 10 && (e == null || e.OfferId == null)
 select new { PromotionalOffers = s, PromotionalOffersUsed = joinT } ).ToListAsync();
像这样尝试

(from s in db.PromotionalOffers
 join e in db.PromotionalOffersUsed on s.Id equals e.OfferId into joinT
 from e in joinT.DefaultIfEmpty()
 where s.ISVCSPId == 10 && (e == null || e.OfferId == null)
 select new { PromotionalOffers = s, PromotionalOffersUsed = joinT } ).ToListAsync();

显然,在
PromotionalOffers
promotionoffers used
:每个
promotionoffer
都有零个或多个
promotionoffers used
,并且每个
promotionoffers used
都只属于一个
promotionoffer

如果遵循关系,则不需要执行联接或左外联接,而是使用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;
}

因为实体框架知道存在一对多的外键,它将为您进行适当的左外连接。

显然,您在
促销优惠之间存在一对多关系
promotionoffers used
:每个
promotionoffer
都有零个或多个
promotionoffers used
,并且每个
promotionoffers used
都只属于一个
promotionoffer

如果遵循关系,则不需要执行联接或左外联接,而是使用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;
}

因为实体框架知道存在一对多的外键,它将为您执行正确的左外联接。

感谢您的快速响应,但我无法在条件中获取e以检查感谢您的快速响应,但我无法在条件中获取e以检查感谢您的快速响应,但在选择需要检查条件的字段之前。感谢您的快速响应响应,但在选择需要检查条件的字段之前。