实体框架和报表查询
本文关键字:查询 报表 框架 实体 | 更新日期: 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>();
}
}