使用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世界中的所有工作。
你的想法? 谢谢!
答案 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>();
}
}