C# 使用Linq分组
我需要提供一个按类别分组的广告列表,包括每个类别的广告数量 类别按父类别分组,如汽车,包括轿车、敞篷车和运动类 型号:C# 使用Linq分组,c#,sql,asp.net-mvc,linq,C#,Sql,Asp.net Mvc,Linq,我需要提供一个按类别分组的广告列表,包括每个类别的广告数量 类别按父类别分组,如汽车,包括轿车、敞篷车和运动类 型号: public class Ad { [Key] public int Id { get; set; } public Category Category { get; set; } } public class Category { public int Id { get; set; } [ForeignKey("CategoryP
public class Ad
{
[Key]
public int Id { get; set; }
public Category Category { get; set; }
}
public class Category
{
public int Id { get; set; }
[ForeignKey("CategoryParent")]
public int? CategoryParent_Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Ad> Ads { get; set; }
}
目前,我只能显示所有类别的列表,而不能按父类别进行分组
var adIds = {1,2,4,5}
var result =
from c in categoryQuery
let searchCount = c.Ads.Count(a => adIds.Contains(a.Id))
where searchCount > 0
select new CategoryGetAllBySearchDto
{
Id = c.CategoryParent_Id,
Name = c.CategoryParent.Name,
SearchCount = searchCount,
Ids = c.Ads.Where(a => adIds.Contains(a.Id)).Select(a => a.Id)
};
我想你需要这个:
var adIds = { 1, 2, 4, 5 };
var result = from c in categoryQuery
where c.Ads.Any(a => adIds.Contains(a.Id))
group c by new {c.CategoryParent_Id, c.CategoryParent.Name} into g
select new CategoryGetAllBySearchDto
{
Id = g.Key.CategoryParent_Id,
Name = g.Key.Name,
SearchCount = g.SelectMany(u => u.Ads)
.Where(a => adIds.Contains(a.Id))
.Count(),
Ids = g.SelectMany(u => u.Ads)
.Where(a => adIds.Contains(a.Id))
.Select(a => a.Id)
};
我想你需要这个:
var adIds = { 1, 2, 4, 5 };
var result = from c in categoryQuery
where c.Ads.Any(a => adIds.Contains(a.Id))
group c by new {c.CategoryParent_Id, c.CategoryParent.Name} into g
select new CategoryGetAllBySearchDto
{
Id = g.Key.CategoryParent_Id,
Name = g.Key.Name,
SearchCount = g.SelectMany(u => u.Ads)
.Where(a => adIds.Contains(a.Id))
.Count(),
Ids = g.SelectMany(u => u.Ads)
.Where(a => adIds.Contains(a.Id))
.Select(a => a.Id)
};
我想你需要这个:
var adIds = { 1, 2, 4, 5 };
var result = from c in categoryQuery
where c.Ads.Any(a => adIds.Contains(a.Id))
group c by new {c.CategoryParent_Id, c.CategoryParent.Name} into g
select new CategoryGetAllBySearchDto
{
Id = g.Key.CategoryParent_Id,
Name = g.Key.Name,
SearchCount = g.SelectMany(u => u.Ads)
.Where(a => adIds.Contains(a.Id))
.Count(),
Ids = g.SelectMany(u => u.Ads)
.Where(a => adIds.Contains(a.Id))
.Select(a => a.Id)
};
我想你需要这个:
var adIds = { 1, 2, 4, 5 };
var result = from c in categoryQuery
where c.Ads.Any(a => adIds.Contains(a.Id))
group c by new {c.CategoryParent_Id, c.CategoryParent.Name} into g
select new CategoryGetAllBySearchDto
{
Id = g.Key.CategoryParent_Id,
Name = g.Key.Name,
SearchCount = g.SelectMany(u => u.Ads)
.Where(a => adIds.Contains(a.Id))
.Count(),
Ids = g.SelectMany(u => u.Ads)
.Where(a => adIds.Contains(a.Id))
.Select(a => a.Id)
};
您可以取出
SearchCount
并将AsEnumerable
添加到Ids
中,以便只获取一次查询
public class CategoryGetAllBySearchDto
{
public int? Id { get; set; }
public string Name { get; set; }
public int SearchCount { get { return this.Ids.Count() } }
public IEnumerable<int> Ids { get; set; }
}
您可以取出
SearchCount
并将AsEnumerable
添加到Ids
中,以便只获取一次查询
public class CategoryGetAllBySearchDto
{
public int? Id { get; set; }
public string Name { get; set; }
public int SearchCount { get { return this.Ids.Count() } }
public IEnumerable<int> Ids { get; set; }
}
您可以取出
SearchCount
并将AsEnumerable
添加到Ids
中,以便只获取一次查询
public class CategoryGetAllBySearchDto
{
public int? Id { get; set; }
public string Name { get; set; }
public int SearchCount { get { return this.Ids.Count() } }
public IEnumerable<int> Ids { get; set; }
}
您可以取出
SearchCount
并将AsEnumerable
添加到Ids
中,以便只获取一次查询
public class CategoryGetAllBySearchDto
{
public int? Id { get; set; }
public string Name { get; set; }
public int SearchCount { get { return this.Ids.Count() } }
public IEnumerable<int> Ids { get; set; }
}
GroupBy
内存中:
var adIds = { 1, 2, 4, 5 };
var result = categoryQuery.Where(c => c.Ads.Any(a => adIds.Contains(a.Id)))
.Select(c => new
{
c.CategoryParent_Id,
c.CategoryParent.Name,
Ids = c.Ads.Where(a => adIds.Contains(a.Id)).Select(a => a.Id).AsEnumerable()
})
.ToList()
.GroupBy(c => new {c.CategoryParent_Id, c.Name})
.Select(g => new CategoryGetAllBySearchDto
{
Id = g.Key.CategoryParent_Id,
Name = g.Key.Name,
Ids = g.SelectMany(u => u.Ids).AsEnumerable()
})
.ToList();
GroupBy
内存中:
var adIds = { 1, 2, 4, 5 };
var result = categoryQuery.Where(c => c.Ads.Any(a => adIds.Contains(a.Id)))
.Select(c => new
{
c.CategoryParent_Id,
c.CategoryParent.Name,
Ids = c.Ads.Where(a => adIds.Contains(a.Id)).Select(a => a.Id).AsEnumerable()
})
.ToList()
.GroupBy(c => new {c.CategoryParent_Id, c.Name})
.Select(g => new CategoryGetAllBySearchDto
{
Id = g.Key.CategoryParent_Id,
Name = g.Key.Name,
Ids = g.SelectMany(u => u.Ids).AsEnumerable()
})
.ToList();
GroupBy
内存中:
var adIds = { 1, 2, 4, 5 };
var result = categoryQuery.Where(c => c.Ads.Any(a => adIds.Contains(a.Id)))
.Select(c => new
{
c.CategoryParent_Id,
c.CategoryParent.Name,
Ids = c.Ads.Where(a => adIds.Contains(a.Id)).Select(a => a.Id).AsEnumerable()
})
.ToList()
.GroupBy(c => new {c.CategoryParent_Id, c.Name})
.Select(g => new CategoryGetAllBySearchDto
{
Id = g.Key.CategoryParent_Id,
Name = g.Key.Name,
Ids = g.SelectMany(u => u.Ids).AsEnumerable()
})
.ToList();
GroupBy
内存中:
var adIds = { 1, 2, 4, 5 };
var result = categoryQuery.Where(c => c.Ads.Any(a => adIds.Contains(a.Id)))
.Select(c => new
{
c.CategoryParent_Id,
c.CategoryParent.Name,
Ids = c.Ads.Where(a => adIds.Contains(a.Id)).Select(a => a.Id).AsEnumerable()
})
.ToList()
.GroupBy(c => new {c.CategoryParent_Id, c.Name})
.Select(g => new CategoryGetAllBySearchDto
{
Id = g.Key.CategoryParent_Id,
Name = g.Key.Name,
Ids = g.SelectMany(u => u.Ids).AsEnumerable()
})
.ToList();
我知道,对于每个类别,您都想知道类别本身及其所有继承类别(子女、孙子等)中的项目数量之和。对吗?您还说您需要一个项目列表或项目组。这不是很清楚。谢谢。您的示例显示了计数的概念,但不是项目列表。您好,谢谢。我想按ParentCategory和子类别的所有广告计数对类别进行分组。比如汽车:100辆(轿车、敞篷车等的总和)自行车:20辆(直升机等的总和)。我知道,对于每个类别,您都想知道类别本身及其所有继承类别(子女、孙子等)中项目数量的总和。对吗?您还说您需要一个项目列表或项目组。这不是很清楚。谢谢。您的示例显示了计数的概念,但不是项目列表。您好,谢谢。我想按ParentCategory和子类别的所有广告计数对类别进行分组。比如汽车:100辆(轿车、敞篷车等的总和)自行车:20辆(直升机等的总和)。我知道,对于每个类别,您都想知道类别本身及其所有继承类别(子女、孙子等)中项目数量的总和。对吗?您还说您需要一个项目列表或项目组。这不是很清楚。谢谢。您的示例显示了计数的概念,但不是项目列表。您好,谢谢。我想按ParentCategory和子类别的所有广告计数对类别进行分组。比如汽车:100辆(轿车、敞篷车等的总和)自行车:20辆(直升机等的总和)。我知道,对于每个类别,您都想知道类别本身及其所有继承类别(子女、孙子等)中项目数量的总和。对吗?您还说您需要一个项目列表或项目组。这不是很清楚。谢谢。您的示例显示了计数的概念,但不是项目列表。您好,谢谢。我想按ParentCategory和子类别的所有广告计数对类别进行分组。比如汽车:100辆(轿车、敞篷车等的总和)自行车:20辆(直升机等的总和)。嗨,谢谢。我得到的“searchCount”在“searchCount=searchCount”一行的当前上下文中不存在,你知道为什么吗?你也可以从
searchCount
中找到答案,让你的查询更简单,我需要发布另一个答案我的旧版本,其中我只列出了类别计数,而不是CategoryParent分组计数大约150毫秒(Chrome时间),现在是492ms,用于相同的搜索:(它不一样,它有GroupBy
,您也可以获取所有数据,并在momery中对它们进行分组,您好,谢谢。我得到的“searchCount”在当前上下文中的“searchCount=searchCount”行中不存在,你知道为什么吗?你也可以拿出SearchCount
让你的查询更简单,我需要发布另一个答案我的旧版本,其中我只列出了类别计数,而不是CategoryParent分组计数大约为150ms(Chrome时间),现在相同的搜索是492ms:(不一样,它有GroupBy
,您也可以获取所有数据,并在momery中对它们进行分组,您好,谢谢。我得到的“searchCount”在当前上下文中的“searchCount=searchCount”行中不存在,你知道为什么吗?你也可以拿出SearchCount
让你的查询更简单,我需要发布另一个答案我的旧版本,其中我只列出了类别计数,而不是CategoryParent分组计数大约为150ms(Chrome时间),现在相同的搜索是492ms:(不一样,它有GroupBy
,您也可以获取所有数据,并在momery中对它们进行分组,您好,谢谢。我得到的“searchCount”在当前上下文中的“searchCount=searchCount”行中不存在,你知道为什么吗?你也可以拿出SearchCount
让你的查询更简单,我需要发布另一个答案我的旧版本,其中我只列出了类别计数,而不是CategoryParent分组计数大约为150ms(Chrome时间),现在相同的搜索是492ms:(这是不一样的,它有GroupBy
,你也可以获取所有数据,并将它们按时间分组,它正在变得更好!266ms:P在你看来这是我们能达到的最好成绩吗?因为GroupBy
,你可以在内存中执行GroupBy
,检查我的新帖子!266ms:P这是我们在y中能达到的最好成绩吗我们的意见?这是因为GroupBy
,你可以在内存中执行GroupBy
,检查我的新帖子越来越好!266ms:P这是你认为我们能达到的最好的结果吗?这是因为GroupBy
,你可以在内存中执行GroupBy
,检查我的新帖子越来越好!266ms:P这是t吗