访问groupby中每个项目的详细信息



我有一个大型数据库,我需要按组查找每个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();

每个客户都有一些其他属性,如IdPhoneNumberAddress和。从我的表中访问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中的所有细节。

相关内容

  • 没有找到相关文章

最新更新