实体框架和报告查询

时间:2014-05-28 04:18:52

标签: c# sql entity-framework ado.net

使用Entity Framework和SqlQuery()查询数据库的首选/最佳方法是什么?返回数据是SUM和GROUP BY以及来自连接表的各种数据?我不明白如何使用现有的POCO来返回代表所查询数据的POCO。

例如,我有一个委员会类:

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 DataTable和DataSet方法?我希望在新的POCO / Entity Framework世界中我可以做旧的ADO.NET世界中的所有工作。

你的想法? 谢谢!

1 个答案:

答案 0 :(得分:0)

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

您应声明特定类型或使用匿名类型(但在这种情况下必须在函数中使用)

    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>();
        }
    }