C# 根据用户偏好分组计数

C# 根据用户偏好分组计数,c#,performance,linq,linq-to-entities,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;}

我需要根据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生成按用户首选类别分组的产品销售计数报告。 请记住,一种产品可能存在于多个用户首选类别中

我通过点击UserPrefrenceCategory并根据每个用户首选类别的产品列表过滤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;
    }

你能发布到目前为止你有什么吗?Hi Stanley代码已添加