C# linq:具有不同类型条件的linq中的左连接
我有两张表,如promotionalOffers和promotionalOffers UsedC# 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.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以检查感谢您的快速响应,但在选择需要检查条件的字段之前。感谢您的快速响应响应,但在选择需要检查条件的字段之前。