C# 实体框架与报表查询

C# 实体框架与报表查询,c#,sql,entity-framework,ado.net,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 Offer

使用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>();
            }
        }
    }
public静态列表GetOfferCommissionListForMerchant(int-merchantId,DateTime?dateFrom=null,DateTime?dateTo=null)
{
使用(AppDbContext db=new AppDbContext())
{
如果(商品ID>0)
{
var comms=db.Commissions.SqlQuery(“选择[OfferId]、[MerchantId]、[MerchantPresentationVeId]、总和([TotalRevenue])作为总收入、总和([Quantity])作为数量、总和([MerchantRevenue])作为MerchantRevenue、总和([MerchantRecommissionAmount])作为MerchantRecommissionAmount从[Commissions]开始,其中[DateCreated]在@p0和@p1 GROUP BY之间[MerchantRepresentativeId]、[OfferId]、[MerchantId]、[dateFrom、dateTo);
return new List();**//此行用于获取要编译的项目**
}
其他的
{
返回新列表();
}
}
}
虽然这个方法只返回佣金,但我想获取不同表中的商户名称(基于MerchantId)以及返回的每个佣金行的其他相关数据位。我只是不知道如何完成这项任务

我知道这并不能解释我正在处理的整个领域,但我正在努力理解完成这样一项任务的正确方法。我将有其他报告以不同的方式使用类似的数据

我需要恢复到ADO.NET DataTable和DataSet方法吗?我希望我可以在这个新的POCO/Entity框架世界中完成旧ADO.NET世界中的所有工作

你的想法?
谢谢!

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

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

类报告类型{
商业代表,
总收入
}
/* ... */
使用(AppDbContext db=new AppDbContext())
{
如果(商品ID>0)
{
变量通信=
来自数据库中的com
按com分组com.merchantrepresentation进入com组
选择新的报告类型{
MerchantRepresentationVeId=com.MerchantRepresentationVeId,
TotalRevenu=comGroup.Sum(x=>x.TotalRevenu)
}
return comms.ToList();**//此行用于获取要编译的项目**
}
其他的
{
返回新列表();
}
}

所以创建一个新类,专门保存我从数据源返回的值?这很有意义。我希望找到一种使用现有POCO的方法。谢谢。
    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>();
        }
    }