实体框架和报表查询

本文关键字:查询 报表 框架 实体 | 更新日期: 2023-09-27 18:05:41

使用实体框架和SqlQuery()查询数据库的首选/最佳方式是什么,其中返回数据是SUM和GROUP BY,来自连接表的各种数据块?我不明白如何使用现有的POCO来返回一个代表所查询数据的POCO。

例如,我有一个Commission类:

public class Commission
{
    public long CommissionId { get; set; }
    public int OrderId { get; set; }
    public int OfferId { get; set; }
    public decimal TotalRevenue { get; set; }
    public int Quantity { get; set; }
    public int MerchantId { get; set; }
    public decimal MerchantRevenue { get; set; }
    public string MerchantRepresentativeId { get; set; }
    public decimal MerchantRepCommissionPercent { get; set; }
    public decimal MerchantRepCommissionAmount { get; set; }
    public DateTime DateCreated { get; set; }
    [NotMapped]
    public Offer Offer { get; set; }
    [NotMapped]
    public Merchant Merchant { get; set; }
    [NotMapped]
    public ApplicationUser MerchantRep { get; set; }
    public Commission()
    {
        this.DateCreated = DateTime.Now;
    }
}

我有一个GetOfferCommissionListForMerchant()方法,像这样:

    public static List<Commission> GetOfferCommissionListForMerchant(int merchantId, DateTime? dateFrom = null, DateTime? dateTo = null)
    {
        using (AppDbContext db = new AppDbContext())
        {
            if (merchantId > 0)
            {
                var comms = db.Commissions.SqlQuery("SELECT [OfferId],[MerchantId],[MerchantRepresentativeId],SUM([TotalRevenue]) AS TotalRevenue,SUM([Quantity]) AS Quantity,SUM([MerchantRevenue]) AS MerchantRevenue,SUM([MerchantRepCommissionAmount]) AS MerchantRepCommissionAmount FROM [Commissions] WHERE [DateCreated] BETWEEN @p0 AND @p1 GROUP BY [MerchantRepresentativeId], [OfferId],[MerchantId]", dateFrom, dateTo);
                return new List<Commission>();  **//This line is here to get the project to compile**
            }
            else
            {
                return new List<Commission>();
            }
        }
    }

虽然此方法仅返回佣金,但我希望获得位于不同表中的商户名称(基于MerchantId)以及返回的每个佣金行的其他相关数据位。我真不知道该如何完成这项任务。

我明白这并不能解释我正在工作的整个领域,但我正试图理解正确的方式来完成这样的任务。我将有其他报告,以不同的方式使用类似的数据。

我需要恢复到ADO。. NET数据表和数据集方法?我希望我能做我以前在ADO里做的一切。. NET世界在这个新的POCO/实体框架世界。

你的想法吗?谢谢!

实体框架和报表查询

你可以但不应该使用Commission来报告,Commission是一个实体,它是上下文已知的类型,并绑定到一个表。

你应该声明一个特定的类型或者使用一个匿名类型(但是在这种情况下它必须在函数中使用)

    class ReportType {
        MerchantRepresentativeId,
        TotalRevenu
    }
    /* ... */
    using (AppDbContext db = new AppDbContext())
    {
        if (merchantId > 0)
        {
            var comms = 
                from com in db.Commissions
                group com by com.MerchantRepresentativeId into comGroup
                select new ReportType {
                    MerchantRepresentativeId = com.MerchantRepresentativeId,
                    TotalRevenu = comGroup.Sum(x => x.TotalRevenu)                    
                }
            return comms.ToList();  **//This line is here to get the project to compile**
        }
        else
        {
            return new List<ReportType>();
        }
    }