我有一个大型数据库,我需要按组查找每个Customer
的计数。这是我的问题:
var statisticList = (from item in Connection.DBConnection.TBStatistics
where item.Date >= startDate && item.Date <= endDate
group item by item.Customer into grp
where grp.Count() > 1
select new
{
Customer = grp.Key,
Count = grp.Count(),
}).ToList();
每个客户都有一些其他属性,如Id
、PhoneNumber
、Address
和。从我的表中访问statisticList
中每个项目的详细信息:
foreach (var Cus in statisticList)
{
var allPlateDetail = (from item in Connection.DBConnection.TBStatistics
where item.Customer == Cus.Customer &&
item.Date >= startDate && item.Date <= endDate
select item).ToList();
//More Code...
}
但是它很慢!我想让statisticList
中每个项目的Id
在我的数据库中快速找到记录。这可能吗?
或者有没有办法在statisticList
中拥有所有这些属性?喜欢将子列表添加到列表中吗?
我在Linq->Sql或EntityFramework中为零。我将提供一些关于Linq->Objects的想法,您可以尝试在Linq->Sql中转换它。
首先,where grp.Count() > 1
是昂贵的O(n),所以我们使用grp.Any()
,它是O(1)运算。然后我们就可以像这样通过GroupBy
得到这个群。
var statisticList = (from item in Connection.DBConnection.TBStatistics
where item.Date >= startDate && item.Date <= endDate
group item by item.Customer into grp
where grp.Any()
select new
{
Customer = grp.Key,
//Count = grp.Count(), Note I think we don't need it we can use GroupItems.Count instead
GroupItems = grp.ToList()
}).ToList();
foreach (var Cus in statisticList)
{
//Do whatever with Cus.GroupItems
}
我不确定这是否适用于Linq->Sql或EntityFramework,如果没有帮助,我深表歉意。我将删除我的答案。
public class StatisticsGroup
{
public IEnumerable<DB.TBStatistic> TBStatisticRecords { get; set; }
public string Customer { get; set; }
public int Count { get; set; }
}
然后我在查询中使用了这个类:
var statisticList = (from item in Connection.DBConnection.TBStatistics
where item.Date >= startDate && item.Date <= endDate
group item by item.Customer into grp
where grp.Any()
select new StatisticsGroup
{
Customer = grp.Key,
Count = grp.Count(),
TBStatisticRecords = grp.Select(p=> p)
}).ToList();
现在我有了TBStatisticRecords
中的所有细节。