在实体框架中加入时,如何基于列检索不同的行?

时间:2019-05-02 06:10:02

标签: c# entity-framework join

我想联接2个表并基于实体框架中的2列检索不同的行。

我已经阅读了网上的帖子,包括SO。

在下面的代码中,
1.我根据CurrentTurnID键加入2个表
2.我通过所需的功能过滤表格
3.我通过设置选定要素的条件来过滤表格
4.我选择一列来计算所有值的总和

我只需要检索一次具有相同CurrentTurnID的记录。这是我的代码:

int services = Convert.ToInt32(database.Tbl_CurrentTurn.AsNoTracking()
            .Join(database.Tbl_pay.AsNoTracking(), f => f.CurrentTurnID,
               s => s.CurrentTurnID, (f, s) => new
               {
                   f.CurrentTurnOfficialID,
                   f.CurrentTurnID,
                   f.SickID,
                   f.Remove,
                   f.Payment,
                   f.ServicePayment,
                   s.isDeposit
               })
            .Where(w => w.SickID == SickId && w.Remove != true && w.Payment == true && w.isDeposit != true)
            .Select(s => s.ServicePayment).DefaultIfEmpty(0).Sum());

如果我在Distinct()语句后添加Select(),它将考虑ServicePayment来过滤不同的行。

更新The Image is attached to my Dropbox. 第二和第三条记录具有相同的CurrentTurnID值。因此,我只考虑其中之一。然后在ServicePayment列上汇总记录。请注意,这2个记录中的其他列是不同的。

1 个答案:

答案 0 :(得分:0)

您可以尝试GroupJoin来获取该信息,而无需像这样的Distinct

int services = Convert.ToInt32(database.Tbl_CurrentTurn.AsNoTracking()
        .GroupJoin(database.Tbl_pay.AsNoTracking(), f => f.CurrentTurnID,
           s => s.CurrentTurnID, (f, s) => new {f, s})
         .SelectMany(x=> x.s.DefaultIfEmpty(), (f, s) => new
           {
               f.CurrentTurnOfficialID,
               f.CurrentTurnID,
               f.SickID,
               f.Remove,
               f.Payment,
               ServicePayment = s != null ? s.ServicePayment : 0,
               s.isDeposit
           })
        .Where(w => w.SickID == SickId && w.Remove != true && w.Payment == true 
               && w.isDeposit != true)
        .Select(x=> x.ServicePayment).Sum());

这可能无法正确编译,因为我没有所有变量,并且可以使用一个小示例进行测试。

只需很少的更改就可以使它生效。我使用类似的查询来获取费用报告列表。