根据用户偏好进行分组计数

时间:2014-10-31 12:59:53

标签: c# performance linq linq-to-entities

我需要根据UserPrefrenceCategory获取分组数据和计数。 这不是实际情况,但它是我需要做的类似的简单案例:

public class ProductSale{
 public long ID {get; set;}
 public long ProductID {get; set;}
 public DateTime SaleDate {get; set;}
 ...
}

public class Product{
  public long ID {get; set;}
  public string Description {get; set;}
  public long ProductCategoryID {get; set;}
...
}

public class ProductCategory{
 public long ID {get; set;}
public string Description {get; set;}
}

public class UserPrefrenceCategory{
  public long ID {get; set;}
  public string Description{get; set;}
}
public class UserPrefrenceCategoryProduct{
  public long UserPrefrenceCategoryID {get; set;}
  public long ProductID {get; set;}
}

根据上述结构,我们需要使用LINQ生成按USer Preferred Category分组的产品销售计数报告。 请记住,一个产品可能存在于多个USer Prefrence类别中。

我已经获得了计算UserPrefrenceCategory并按每个USer首选类别的产品列表过滤ProductSale并获得UserPrefrenceCategory的销售计数。 我想删除循环,因为这不会给出快速的结果,我需要以更好的方式实现使用Linq获得这些结果。

提前感谢任何指导。

已更新

这是我的代码

public static IEnumerable<ProductUserPrefrenceSale> GetProductSale(DateTime startDate, DateTime endDate)
    {
        using (var db = new Entities())
        {
            var sales= db.ProductSale.Where(x =>  x.SaleDate  >= startDate && x.SaleDate  <= endDate).ToList();
    var productids=(from r in sales 
                             group r by r.ProductID
                             into g
                             select (g.Key));

    var productGroupList = db.UserPrefrenceCategoryProduct.Where(x => x.Product.Any(s => productids.Contains(s.ID))).ToList()
                .Select(x => new ProductUserPrefrenceSale{ ID = x.ID, UserCategory= x.Description, Count = GetUserPrefrenceCategoryWiseCount(sales, x.Product.Select(s => s.ID)) }).ToList();

            return productGroupList;

        }

    }

    public static long GetUserPrefrenceCategoryWiseCount(IEnumerable<ProductSale> sales, IEnumerable<long> productid)
    {
        var result= (from s in sales
                                where productid.Contains((int) s.ProductID)
                                select  s.Count() ).ToList();
        return result;
    }

0 个答案:

没有答案