1

我对 Linq 和实体框架非常陌生。我正在尝试将 WCF RIA 服务创建到我正在创建的 LightSwitch 订单管理应用程序中。我已经使用 Linq 创建了 7 或 8 个查询(很头疼),但我成功了。现在我需要使用三个表创建一个按月获取 TotalSales 和 TotalExpenses 的查询:

DetailsVentes (SaleDetails) 组成:DateOfOrder、Quantity、UnitPrice、Total....等 DetailsAchat (PurchaseDetails) 组成相同字段 Charges (Expenses) 组成:DateOfExpense、ExpenseType、Cost....等

现在我想要一个查询来找到每月的净收入(收入=TotalSales-TotalPurchases-TotalExpenses)

我试过这个查询

      Return From od In Me.Context.DetailsVentes
                From od2 In Me.Context.DetailsAchats
                   From od3 In Me.Context.Charges
              Group By Month = od.Vente.DateCommande.Month, Year = od.Vente.DateCommande.Year
              Into g = Group
              Select New TCR With {.Month = Month, .Year = Year, 
.MonthYearString = Month & "/" & Year, 
.TotalVentes = g.Sum(Function(s) (s.od.PrixUnitaire * s.od.Quantité)), 
.TotalAchats = g.Sum(Function(s) (s.od2.PrixAchat * s.od2.Quantité)), 
.TotalCharges = g.Sum(Function(s) (s.od3.Cout))}

其中 Vente 是销售(订单),DetailVentes 是 OrderDetails Achat 是采购,而 DetailAchat PurchaseDetail a Charge 是费用。

问题是我得到了奇怪的结果。所有值(TotalVentes、TotalAchats、TotalCharges)都乘以 13 !

例如,如果我在 2011 年 6 月的总销售额为 10 000 美元,则此查询返回 130 000 美元!

我真的被困了 4 天,试图获得正确的查询。

我再说一遍,我是 Linq 的新手:p

非常感谢你。

编辑:我尝试了@Jason 的建议,我这样做了:

Return From c In Me.Context.Charges
                         Join v In Me.Context.DetailsVentes On c.DateCharge.Month Equals v.Vente.DateCommande.Month And c.DateCharge.Year Equals v.Vente.DateCommande.Year
                 Join a In Me.Context.DetailsAchats On c.DateCharge.Month Equals a.Achat.DateCommande.Month And c.DateCharge.Year Equals a.Achat.DateCommande.Year
 Group By month = c.DateCharge.Month, Year = c.DateCharge.Year
                 Into g = Group
Select New TCR With {.Month = month, .Year = Year, .MonthYearString = "", .TotalAchats = g.Sum(Function(c) (c.a.Quantité * c.a.PrixAchat)), .TotalCharges = 45000, .TotalVentes = 250000, .TCRSingle = 0}

结果仍然很奇怪(非常高)!任何我可以遵循的例子?

谢谢你。

4

2 回答 2

1

我终于通过将查询拆分为 3 个这样的查询来实现它:

Dim vt = From od In Me.Context.DetailsVentes
     Group By Month = od.Vente.DateCommande.Month, Year = od.Vente.DateCommande.Year
     Into g = Group
     Select New VentesParMois With {.Month = Month, .Year = Year,
                                   .TotalVentesSingle = g.Sum(Function(od) _
                                       (od.PrixUnitaire * od.Quantité))}



Dim at = From od In Me.Context.DetailsAchats
      Group By Month = od.Achat.DateCommande.Month, Year = od.Achat.DateCommande.Year
      Into g = Group
      Select New AchatsParMois With {.Month = Month, .Year = Year, 
                                    .TotalAchatsSingle = g.Sum(Function(od) _
                                        (od.PrixAchat * od.Quantité))}


Dim ct = From od In Me.Context.Charges
     Group By Month = od.DateCharge.Month, Year = od.DateCharge.Year
     Into g = Group
     Select New ChargesParMois With {.Month = Month, .Year = Year, 
                                   .TotalChargesSingle = g.Sum(Function(od) _
                                       (od.Montant))}



Dim q = From a In at.AsEnumerable, v In vt.AsEnumerable, c In ct.AsEnumerable
        Where a.MonthYear = v.MonthYear AndAlso a.MonthYear = c.MonthYear
                Select New TCR With {.Month = a.Month, .Year = a.Year, .TotalAchats = a.TotalAchats, .TotalVentes = v.TotalVentes, .TotalCharges = c.TotalCharges}


Return q.AsQueryable

非常感谢杰森。

于 2011-07-25T06:59:09.390 回答
0

我怀疑您希望在查询中的某个地方加入而不是笛卡尔积(没有任何加入条件的加入)。

于 2011-07-24T11:31:59.830 回答