C# LINQ通过扩展方法与group by count进行左外部联接
我有两张桌子<代码>类别和C# LINQ通过扩展方法与group by count进行左外部联接,c#,.net,entity-framework,linq,C#,.net,Entity Framework,Linq,我有两张桌子类别和广告 每个类别在广告表中都可以有许多广告 我想要所有类别的详细信息,包括每个类别有多少广告 以下是我的Linq表达式,它只获取包含广告的类别,因为FirstOrDefault() 我想知道,如果条件加上位置id(比如:lid)为“7”的类别,我如何才能实现结果 我的表情如下 var x1 = context.Categories .GroupJoin( context.ads,
广告
每个类别
在广告
表中都可以有许多广告
我想要所有类别的详细信息,包括每个类别有多少广告
以下是我的Linq表达式,它只获取包含广告的类别,因为FirstOrDefault()
我想知道,如果条件加上位置id(比如:lid)为“7”的类别,我如何才能实现结果
我的表情如下
var x1 = context.Categories
.GroupJoin(
context.ads,
cat => cat.id,
ad => ad.catid,
(cat, ad) => new { cats = cat, ads = ad })
.SelectMany(
a => a.ads.DefaultIfEmpty(),
(a, y) => new { catss = a.cats, adss = y })
.GroupBy(w => w.adss,ww=>new { cat=ww.catss,count=ww.catss.ads.Count()})
.Where(s=>s.FirstOrDefault().cat.lid==7);
您可以尝试以下方法:
var result = context.Categories
.Where(category => category.lid == 7)
.GroupJoin(
context.ads
, category => category.id
, ad => ad.catid
, (c,a) => new
{
Category = category,
NumberOfAds = a.DefaultIfEmpty().Count(x => x!=null)
});
您可以尝试以下方法:
var result = context.Categories
.Where(category => category.lid == 7)
.GroupJoin(
context.ads
, category => category.id
, ad => ad.catid
, (c,a) => new
{
Category = category,
NumberOfAds = a.DefaultIfEmpty().Count(x => x!=null)
});
显然,
类别
和广告
之间存在一对多的关系:每个类别
都有零个或多个广告
,而每个广告
恰好属于一个类别
在适当的实体框架中,这将建模如下:
class Category
{
public int Id {get; set;}
// every Category has zero or more Adds:
public virtual ICollection<Ad> Ads {get; set;}
...
}
class Ad
{
public int Id {get; set;}
// every Ad belongs to exactly one Category, using foreign key CategoryId:
public int CategoryId {get; set;}
public Category Category {get; set;}
...
}
换句话说:对于类别集合中的每个类别,创建一个新的匿名类对象,该对象具有两个属性:
- 类别包含所考虑的类别
- AdCount包含类别拥有的广告数量
实体框架的模型将理解这样做需要一个连接和一个计数。显然,
类别
和广告
之间存在一对多的关系:每个类别
都有零个或多个广告
,每个广告
都只属于一个类别
在适当的实体框架中,这将建模如下:
class Category
{
public int Id {get; set;}
// every Category has zero or more Adds:
public virtual ICollection<Ad> Ads {get; set;}
...
}
class Ad
{
public int Id {get; set;}
// every Ad belongs to exactly one Category, using foreign key CategoryId:
public int CategoryId {get; set;}
public Category Category {get; set;}
...
}
换句话说:对于类别集合中的每个类别,创建一个新的匿名类对象,该对象具有两个属性:
- 类别包含所考虑的类别
- AdCount包含类别拥有的广告数量
实体框架的模型将理解,要做到这一点,需要连接和计数。我正在寻找扩展方法solution@Alex更新。请让我知道,如果这是你需要的。我想要所有的类别,无论他们是否有广告。如果没有广告,则计数应为0。@Alex根据您的评论,我认为上述查询无法解决您的问题。所以,让我们澄清一些我可能误解的事情。您不想要位置id为7的类别吗?您已经明确说明了这一点
,因为条件加上只有位置id(比如:lid)为“7”的类别。
如果您正确地显示了您要查找的内容,那么如何获得所有类别?@Christos的答案写得很好。您可以将其改进为所需的格式,只需对GroupBy和Select子句进行少量更改solution@Alex更新。请让我知道,如果这是你需要的。我想要所有的类别,无论他们是否有广告。如果没有广告,则计数应为0。@Alex根据您的评论,我认为上述查询无法解决您的问题。所以,让我们澄清一些我可能误解的事情。您不想要位置id为7的类别吗?您已经明确说明了这一点,因为条件加上只有位置id(比如:lid)为“7”的类别。
如果您正确地显示了您要查找的内容,那么如何获得所有类别?@Christos的答案写得很好。您可以将其改进为所需格式,只需在GroupBy和Select子句上稍作更改。感谢您的回答,但已接受的回答显示出被询问但获得好答案的左外连接值得+1感谢您的回答,但已接受的回答显示出被询问但获得好答案的左外连接值得+1